diff options
author | Ralf Baechle <ralf@linux-mips.org> | 1998-08-25 09:12:35 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 1998-08-25 09:12:35 +0000 |
commit | c7fc24dc4420057f103afe8fc64524ebc25c5d37 (patch) | |
tree | 3682407a599b8f9f03fc096298134cafba1c9b2f /include | |
parent | 1d793fade8b063fde3cf275bf1a5c2d381292cd9 (diff) |
o Merge with Linux 2.1.116.
o New Newport console code.
o New G364 console code.
Diffstat (limited to 'include')
483 files changed, 18386 insertions, 10619 deletions
diff --git a/include/asm-alpha/lca.h b/include/asm-alpha/core_lca.h index f1f8a1ad7..bce449fa4 100644 --- a/include/asm-alpha/lca.h +++ b/include/asm-alpha/core_lca.h @@ -1,6 +1,10 @@ #ifndef __ALPHA_LCA__H__ #define __ALPHA_LCA__H__ +#include <linux/config.h> +#include <asm/system.h> +#include <asm/compiler.h> + /* * Low Cost Alpha (LCA) definitions (these apply to 21066 and 21068, * for example). @@ -52,21 +56,16 @@ * ugh). */ -#include <linux/config.h> -#include <asm/system.h> - -#ifdef CONFIG_ALPHA_SRM_SETUP -/* if we are using the SRM PCI setup, we'll need to use variables instead */ -#define LCA_DMA_WIN_BASE_DEFAULT (1024*1024*1024) -#define LCA_DMA_WIN_SIZE_DEFAULT (1024*1024*1024) - -extern unsigned int LCA_DMA_WIN_BASE; -extern unsigned int LCA_DMA_WIN_SIZE; +#define LCA_DMA_WIN_BASE_DEFAULT (1024*1024*1024) +#define LCA_DMA_WIN_SIZE_DEFAULT (1024*1024*1024) -#else /* SRM_SETUP */ -#define LCA_DMA_WIN_BASE (1024*1024*1024) -#define LCA_DMA_WIN_SIZE (1024*1024*1024) -#endif /* SRM_SETUP */ +#if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_SRM_SETUP) +#define LCA_DMA_WIN_BASE alpha_mv.dma_win_base +#define LCA_DMA_WIN_SIZE alpha_mv.dma_win_size +#else +#define LCA_DMA_WIN_BASE LCA_DMA_WIN_BASE_DEFAULT +#define LCA_DMA_WIN_SIZE LCA_DMA_WIN_SIZE_DEFAULT +#endif /* * Memory Controller registers: @@ -139,7 +138,7 @@ extern unsigned int LCA_DMA_WIN_SIZE; #define LCA_IOC_STAT0_P_NBR_SHIFT 13 #define LCA_IOC_STAT0_P_NBR_MASK 0x7ffff -#define HAE_ADDRESS LCA_IOC_HAE +#define LCA_HAE_ADDRESS LCA_IOC_HAE /* LCA PMR Power Management register defines */ #define LCA_PMR_ADDR (IDENT_ADDR + 0x120000098UL) @@ -147,43 +146,87 @@ extern unsigned int LCA_DMA_WIN_SIZE; #define LCA_PMR_ODIV 0x38 /* Override clock divisor */ #define LCA_PMR_INTO 0x40 /* Interrupt override */ #define LCA_PMR_DMAO 0x80 /* DMA override */ -#define LCA_PMR_OCCEB 0xffff0000L /* Override cycle counter - even - bits */ -#define LCA_PMR_OCCOB 0xffff000000000000L /* Override cycle counter - even - bits */ +#define LCA_PMR_OCCEB 0xffff0000L /* Override cycle counter - even bits */ +#define LCA_PMR_OCCOB 0xffff000000000000L /* Override cycle counter - even bits */ #define LCA_PMR_PRIMARY_MASK 0xfffffffffffffff8 + /* LCA PMR Macros */ -#define READ_PMR (*(volatile unsigned long *)LCA_PMR_ADDR) -#define WRITE_PMR(d) (*((volatile unsigned long *)LCA_PMR_ADDR) = (d)) +#define LCA_READ_PMR (*(volatile unsigned long *)LCA_PMR_ADDR) +#define LCA_WRITE_PMR(d) (*((volatile unsigned long *)LCA_PMR_ADDR) = (d)) -#define GET_PRIMARY(r) ((r) & LCA_PMR_PDIV) -#define GET_OVERRIDE(r) (((r) >> 3) & LCA_PMR_PDIV) -#define SET_PRIMARY_CLOCK(r, c) ((r) = (((r) & LCA_PMR_PRIMARY_MASK) | (c))) +#define LCA_GET_PRIMARY(r) ((r) & LCA_PMR_PDIV) +#define LCA_GET_OVERRIDE(r) (((r) >> 3) & LCA_PMR_PDIV) +#define LCA_SET_PRIMARY_CLOCK(r, c) ((r) = (((r) & LCA_PMR_PRIMARY_MASK)|(c))) /* LCA PMR Divisor values */ -#define DIV_1 0x0 -#define DIV_1_5 0x1 -#define DIV_2 0x2 -#define DIV_4 0x3 -#define DIV_8 0x4 -#define DIV_16 0x5 -#define DIV_MIN DIV_1 -#define DIV_MAX DIV_16 +#define LCA_PMR_DIV_1 0x0 +#define LCA_PMR_DIV_1_5 0x1 +#define LCA_PMR_DIV_2 0x2 +#define LCA_PMR_DIV_4 0x3 +#define LCA_PMR_DIV_8 0x4 +#define LCA_PMR_DIV_16 0x5 +#define LCA_PMR_DIV_MIN DIV_1 +#define LCA_PMR_DIV_MAX DIV_16 + + +/* + * Data structure for handling LCA machine checks. Correctable errors + * result in a short logout frame, uncorrectable ones in a long one. + */ +struct el_lca_mcheck_short { + struct el_common h; /* common logout header */ + unsigned long esr; /* error-status register */ + unsigned long ear; /* error-address register */ + unsigned long dc_stat; /* dcache status register */ + unsigned long ioc_stat0; /* I/O controller status register 0 */ + unsigned long ioc_stat1; /* I/O controller status register 1 */ +}; + +struct el_lca_mcheck_long { + struct el_common h; /* common logout header */ + unsigned long pt[31]; /* PAL temps */ + unsigned long exc_addr; /* exception address */ + unsigned long pad1[3]; + unsigned long pal_base; /* PALcode base address */ + unsigned long hier; /* hw interrupt enable */ + unsigned long hirr; /* hw interrupt request */ + unsigned long mm_csr; /* MMU control & status */ + unsigned long dc_stat; /* data cache status */ + unsigned long dc_addr; /* data cache addr register */ + unsigned long abox_ctl; /* address box control register */ + unsigned long esr; /* error status register */ + unsigned long ear; /* error address register */ + unsigned long car; /* cache control register */ + unsigned long ioc_stat0; /* I/O controller status register 0 */ + unsigned long ioc_stat1; /* I/O controller status register 1 */ + unsigned long va; /* virtual address register */ +}; +union el_lca { + struct el_common * c; + struct el_lca_mcheck_long * l; + struct el_lca_mcheck_short * s; +}; #ifdef __KERNEL__ +#ifndef __EXTERN_INLINE +#define __EXTERN_INLINE extern inline +#define __IO_EXTERN_INLINE +#endif + /* * Translate physical memory address as seen on (PCI) bus into * a kernel virtual address and vv. */ -extern inline unsigned long virt_to_bus(void * address) + +__EXTERN_INLINE unsigned long lca_virt_to_bus(void * address) { return virt_to_phys(address) + LCA_DMA_WIN_BASE; } -extern inline void * bus_to_virt(unsigned long address) +__EXTERN_INLINE void * lca_bus_to_virt(unsigned long address) { /* * This check is a sanity check but also ensures that bus @@ -207,46 +250,46 @@ extern inline void * bus_to_virt(unsigned long address) * data to/from the right byte-lanes. */ +#define vip volatile int * #define vuip volatile unsigned int * +#define vulp volatile unsigned long * -extern inline unsigned int __inb(unsigned long addr) +__EXTERN_INLINE unsigned int lca_inb(unsigned long addr) { - long result = *(vuip) ((addr << 5) + LCA_IO + 0x00); - result >>= (addr & 3) * 8; - return 0xffUL & result; + long result = *(vip) ((addr << 5) + LCA_IO + 0x00); + return __kernel_extbl(result, addr & 3); } -extern inline void __outb(unsigned char b, unsigned long addr) +__EXTERN_INLINE void lca_outb(unsigned char b, unsigned long addr) { unsigned int w; - asm ("insbl %2,%1,%0" : "r="(w) : "ri"(addr & 0x3), "r"(b)); + w = __kernel_insbl(b, addr & 3); *(vuip) ((addr << 5) + LCA_IO + 0x00) = w; mb(); } -extern inline unsigned int __inw(unsigned long addr) +__EXTERN_INLINE unsigned int lca_inw(unsigned long addr) { - long result = *(vuip) ((addr << 5) + LCA_IO + 0x08); - result >>= (addr & 3) * 8; - return 0xffffUL & result; + long result = *(vip) ((addr << 5) + LCA_IO + 0x08); + return __kernel_extwl(result, addr & 3); } -extern inline void __outw(unsigned short b, unsigned long addr) +__EXTERN_INLINE void lca_outw(unsigned short b, unsigned long addr) { unsigned int w; - asm ("inswl %2,%1,%0" : "r="(w) : "ri"(addr & 0x3), "r"(b)); + w = __kernel_inswl(b, addr & 3); *(vuip) ((addr << 5) + LCA_IO + 0x08) = w; mb(); } -extern inline unsigned int __inl(unsigned long addr) +__EXTERN_INLINE unsigned int lca_inl(unsigned long addr) { return *(vuip) ((addr << 5) + LCA_IO + 0x18); } -extern inline void __outl(unsigned int b, unsigned long addr) +__EXTERN_INLINE void lca_outl(unsigned int b, unsigned long addr) { *(vuip) ((addr << 5) + LCA_IO + 0x18) = b; mb(); @@ -257,46 +300,44 @@ extern inline void __outl(unsigned int b, unsigned long addr) * Memory functions. 64-bit and 32-bit accesses are done through * dense memory space, everything else through sparse space. */ -extern inline unsigned long __readb(unsigned long addr) + +__EXTERN_INLINE unsigned long lca_readb(unsigned long addr) { - unsigned long result, shift, msb; + unsigned long result, msb; - shift = (addr & 0x3) * 8; if (addr >= (1UL << 24)) { msb = addr & 0xf8000000; addr -= msb; - if (msb != hae.cache) { - set_hae(msb); - } + set_hae(msb); } - result = *(vuip) ((addr << 5) + LCA_SPARSE_MEM + 0x00); - result >>= shift; - return 0xffUL & result; + result = *(vip) ((addr << 5) + LCA_SPARSE_MEM + 0x00); + return __kernel_extbl(result, addr & 3); } -extern inline unsigned long __readw(unsigned long addr) +__EXTERN_INLINE unsigned long lca_readw(unsigned long addr) { - unsigned long result, shift, msb; + unsigned long result, msb; - shift = (addr & 0x3) * 8; if (addr >= (1UL << 24)) { msb = addr & 0xf8000000; addr -= msb; - if (msb != hae.cache) { - set_hae(msb); - } + set_hae(msb); } - result = *(vuip) ((addr << 5) + LCA_SPARSE_MEM + 0x08); - result >>= shift; - return 0xffffUL & result; + result = *(vip) ((addr << 5) + LCA_SPARSE_MEM + 0x08); + return __kernel_extwl(result, addr & 3); } -extern inline unsigned long __readl(unsigned long addr) +__EXTERN_INLINE unsigned long lca_readl(unsigned long addr) { return *(vuip) (addr + LCA_DENSE_MEM); } -extern inline void __writeb(unsigned char b, unsigned long addr) +__EXTERN_INLINE unsigned long lca_readq(unsigned long addr) +{ + return *(vulp) (addr + LCA_DENSE_MEM); +} + +__EXTERN_INLINE void lca_writeb(unsigned char b, unsigned long addr) { unsigned long msb; unsigned int w; @@ -304,15 +345,13 @@ extern inline void __writeb(unsigned char b, unsigned long addr) if (addr >= (1UL << 24)) { msb = addr & 0xf8000000; addr -= msb; - if (msb != hae.cache) { - set_hae(msb); - } + set_hae(msb); } - asm ("insbl %2,%1,%0" : "r="(w) : "ri"(addr & 0x3), "r"(b)); + w = __kernel_insbl(b, addr & 3); *(vuip) ((addr << 5) + LCA_SPARSE_MEM + 0x00) = w; } -extern inline void __writew(unsigned short b, unsigned long addr) +__EXTERN_INLINE void lca_writew(unsigned short b, unsigned long addr) { unsigned long msb; unsigned int w; @@ -320,23 +359,52 @@ extern inline void __writew(unsigned short b, unsigned long addr) if (addr >= (1UL << 24)) { msb = addr & 0xf8000000; addr -= msb; - if (msb != hae.cache) { - set_hae(msb); - } + set_hae(msb); } - asm ("inswl %2,%1,%0" : "r="(w) : "ri"(addr & 0x3), "r"(b)); + w = __kernel_inswl(b, addr & 3); *(vuip) ((addr << 5) + LCA_SPARSE_MEM + 0x08) = w; } -extern inline void __writel(unsigned int b, unsigned long addr) +__EXTERN_INLINE void lca_writel(unsigned int b, unsigned long addr) { *(vuip) (addr + LCA_DENSE_MEM) = b; } -/* - * Most of the above have so much overhead that it probably doesn't - * make sense to have them inlined (better icache behavior). - */ +__EXTERN_INLINE void lca_writeq(unsigned long b, unsigned long addr) +{ + *(vulp) (addr + LCA_DENSE_MEM) = b; +} + +/* Find the DENSE memory area for a given bus address. */ + +__EXTERN_INLINE unsigned long lca_dense_mem(unsigned long addr) +{ + return LCA_DENSE_MEM; +} + +#undef vip +#undef vuip +#undef vulp + +#ifdef __WANT_IO_DEF + +#define virt_to_bus lca_virt_to_bus +#define bus_to_virt lca_bus_to_virt +#define __inb lca_inb +#define __inw lca_inw +#define __inl lca_inl +#define __outb lca_outb +#define __outw lca_outw +#define __outl lca_outl +#define __readb lca_readb +#define __readw lca_readw +#define __writeb lca_writeb +#define __writew lca_writew +#define __readl lca_readl +#define __readq lca_readq +#define __writel lca_writel +#define __writeq lca_writeq +#define dense_mem lca_dense_mem #define inb(port) \ (__builtin_constant_p((port))?__inb(port):_inb(port)) @@ -345,55 +413,17 @@ extern inline void __writel(unsigned int b, unsigned long addr) (__builtin_constant_p((port))?__outb((x),(port)):_outb((x),(port))) #define readl(a) __readl((unsigned long)(a)) +#define readq(a) __readq((unsigned long)(a)) #define writel(v,a) __writel((v),(unsigned long)(a)) +#define writeq(v,a) __writeq((v),(unsigned long)(a)) -#undef vuip +#endif /* __WANT_IO_DEF */ -extern unsigned long lca_init (unsigned long mem_start, unsigned long mem_end); +#ifdef __IO_EXTERN_INLINE +#undef __EXTERN_INLINE +#undef __IO_EXTERN_INLINE +#endif #endif /* __KERNEL__ */ -/* - * Data structure for handling LCA machine checks. Correctable errors - * result in a short logout frame, uncorrectable ones in a long one. - */ -struct el_lca_mcheck_short { - struct el_common h; /* common logout header */ - unsigned long esr; /* error-status register */ - unsigned long ear; /* error-address register */ - unsigned long dc_stat; /* dcache status register */ - unsigned long ioc_stat0; /* I/O controller status register 0 */ - unsigned long ioc_stat1; /* I/O controller status register 1 */ -}; - -struct el_lca_mcheck_long { - struct el_common h; /* common logout header */ - unsigned long pt[31]; /* PAL temps */ - unsigned long exc_addr; /* exception address */ - unsigned long pad1[3]; - unsigned long pal_base; /* PALcode base address */ - unsigned long hier; /* hw interrupt enable */ - unsigned long hirr; /* hw interrupt request */ - unsigned long mm_csr; /* MMU control & status */ - unsigned long dc_stat; /* data cache status */ - unsigned long dc_addr; /* data cache addr register */ - unsigned long abox_ctl; /* address box control register */ - unsigned long esr; /* error status register */ - unsigned long ear; /* error address register */ - unsigned long car; /* cache control register */ - unsigned long ioc_stat0; /* I/O controller status register 0 */ - unsigned long ioc_stat1; /* I/O controller status register 1 */ - unsigned long va; /* virtual address register */ -}; - -union el_lca { - struct el_common * c; - struct el_lca_mcheck_long * l; - struct el_lca_mcheck_short * s; -}; - -#define RTC_PORT(x) (0x70 + (x)) -#define RTC_ADDR(x) (0x80 | (x)) -#define RTC_ALWAYS_BCD 0 - #endif /* __ALPHA_LCA__H__ */ diff --git a/include/asm-alpha/mcpcia.h b/include/asm-alpha/core_mcpcia.h index fd4d48839..8b0e03a89 100644 --- a/include/asm-alpha/mcpcia.h +++ b/include/asm-alpha/core_mcpcia.h @@ -4,6 +4,7 @@ #include <linux/config.h> #include <linux/types.h> #include <linux/pci.h> +#include <asm/compiler.h> /* * MCPCIA is the internal name for a core logic chipset which provides @@ -19,7 +20,7 @@ /*------------------------------------------------------------------------** ** ** -** I/O procedures ** +** I/O procedures ** ** ** ** inport[b|w|t|l], outport[b|w|t|l] 8:16:24:32 IO xfers ** ** inportbxt: 8 bits only ** @@ -70,27 +71,23 @@ * */ -#define BYTE_ENABLE_SHIFT 5 -#define TRANSFER_LENGTH_SHIFT 3 +#define MCPCIA_MEM_R1_MASK 0x1fffffff /* SPARSE Mem region 1 mask is 29 bits */ +#define MCPCIA_MEM_R2_MASK 0x07ffffff /* SPARSE Mem region 2 mask is 27 bits */ +#define MCPCIA_MEM_R3_MASK 0x03ffffff /* SPARSE Mem region 3 mask is 26 bits */ -#define MEM_R1_MASK 0x1fffffff /* SPARSE Mem region 1 mask is 29 bits */ -#define MEM_R2_MASK 0x07ffffff /* SPARSE Mem region 2 mask is 27 bits */ -#define MEM_R3_MASK 0x03ffffff /* SPARSE Mem region 3 mask is 26 bits */ - -#ifdef CONFIG_ALPHA_SRM_SETUP -/* if we are using the SRM PCI setup, we'll need to use variables instead */ #define MCPCIA_DMA_WIN_BASE_DEFAULT (2*1024*1024*1024U) #define MCPCIA_DMA_WIN_SIZE_DEFAULT (2*1024*1024*1024U) -extern unsigned int MCPCIA_DMA_WIN_BASE; -extern unsigned int MCPCIA_DMA_WIN_SIZE; - -#else /* SRM_SETUP */ -#define MCPCIA_DMA_WIN_BASE (2*1024*1024*1024UL) -#define MCPCIA_DMA_WIN_SIZE (2*1024*1024*1024UL) -#endif /* SRM_SETUP */ +#if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_SRM_SETUP) +#define MCPCIA_DMA_WIN_BASE alpha_mv.dma_win_base +#define MCPCIA_DMA_WIN_SIZE alpha_mv.dma_win_size +#else +#define MCPCIA_DMA_WIN_BASE MCPCIA_DMA_WIN_BASE_DEFAULT +#define MCPCIA_DMA_WIN_SIZE MCPCIA_DMA_WIN_SIZE_DEFAULT +#endif #define HOSE(h) (((unsigned long)(h)) << 33) + /* * General Registers */ @@ -165,22 +162,38 @@ extern unsigned int MCPCIA_DMA_WIN_SIZE; #define MCPCIA_IO(h) (IDENT_ADDR + 0xf980000000UL + HOSE(h)) #define MCPCIA_SPARSE(h) (IDENT_ADDR + 0xf800000000UL + HOSE(h)) #define MCPCIA_DENSE(h) (IDENT_ADDR + 0xf900000000UL + HOSE(h)) -#define MCPCIA_IACK_SC(h) (IDENT_ADDR + 0xf9f0003f00UL + HOSE(h)) +#define _MCPCIA_IACK_SC(h) (IDENT_ADDR + 0xf9f0003f00UL + HOSE(h)) + +#define MCPCIA_HAE_ADDRESS MCPCIA_HAE_MEM(0) +#define MCPCIA_IACK_SC _MCPCIA_IACK_SC(0) + +/* + * Data structure for handling MCPCIA machine checks: + */ +struct el_MCPCIA_uncorrected_frame_mcheck { + struct el_common header; + struct el_common_EV5_uncorrectable_mcheck procdata; +}; -#define HAE_ADDRESS MCPCIA_HAE_MEM(0) #ifdef __KERNEL__ +#ifndef __EXTERN_INLINE +#define __EXTERN_INLINE extern inline +#define __IO_EXTERN_INLINE +#endif + /* * Translate physical memory address as seen on (PCI) bus into * a kernel virtual address and vv. */ -extern inline unsigned long virt_to_bus(void * address) + +__EXTERN_INLINE unsigned long mcpcia_virt_to_bus(void * address) { return virt_to_phys(address) + MCPCIA_DMA_WIN_BASE; } -extern inline void * bus_to_virt(unsigned long address) +__EXTERN_INLINE void * mcpcia_bus_to_virt(unsigned long address) { return phys_to_virt(address - MCPCIA_DMA_WIN_BASE); } @@ -196,128 +209,93 @@ extern inline void * bus_to_virt(unsigned long address) * Unfortunately, we can't use BWIO with EV5, so for now, we always use SPARSE. */ +#define vucp volatile unsigned char * +#define vusp volatile unsigned short * +#define vip volatile int * #define vuip volatile unsigned int * +#define vulp volatile unsigned long * -#ifdef DISABLE_BWIO_ENABLED - -extern inline unsigned int __inb(unsigned long addr) +#if 0 /* BWIO */ +__EXTERN_INLINE unsigned int mcpcia_bw_inb(unsigned long addr) { - register unsigned long result; - - __asm__ __volatile__ ( - "ldbu %0,%1" - : "=r" (result) - : "m" (*(unsigned char *)(addr+MCPCIA_BW_IO))); - - return result; + return __kernel_ldbu(*(vucp)(addr+MCPCIA_BW_IO)); } -extern inline void __outb(unsigned char b, unsigned long addr) +__EXTERN_INLINE void mcpcia_bw_outb(unsigned char b, unsigned long addr) { - __asm__ __volatile__ ( - "stb %1,%0\n\t" - "mb" - : : "m" (*(unsigned char *)(addr+MCPCIA_BW_IO)), "r" (b)); + __kernel_stb(b, *(vucp)(addr+MCPCIA_BW_IO)); + mb(); } -extern inline unsigned int __inw(unsigned long addr) +__EXTERN_INLINE unsigned int mcpcia_bw_inw(unsigned long addr) { - register unsigned long result; - - __asm__ __volatile__ ( - "ldwu %0,%1" - : "=r" (result) - : "m" (*(unsigned short *)(addr+MCPCIA_BW_IO))); - - return result; + return __kernel_ldwu(*(vusp)(addr+MCPCIA_BW_IO)); } -extern inline void __outw(unsigned short b, unsigned long addr) +__EXTERN_INLINE void mcpcia_bw_outw(unsigned short b, unsigned long addr) { - __asm__ __volatile__ ( - "stw %1,%0\n\t" - "mb" - : : "m" (*(unsigned short *)(addr+MCPCIA_BW_IO)), "r" (b)); + __kernel_stw(b, *(vusp)(addr+MCPCIA_BW_IO)); + mb(); } -extern inline unsigned int __inl(unsigned long addr) +__EXTERN_INLINE unsigned int mcpcia_bw_inl(unsigned long addr) { - register unsigned long result; - - __asm__ __volatile__ ( - "ldl %0,%1" - : "=r" (result) - : "m" (*(unsigned int *)(addr+MCPCIA_BW_IO))); - - return result; + return *(vuip)(addr+MCPCIA_BW_IO); } -extern inline void __outl(unsigned int b, unsigned long addr) +__EXTERN_INLINE void mcpcia_bw_outl(unsigned int b, unsigned long addr) { - __asm__ __volatile__ ( - "stl %1,%0\n\t" - "mb" - : : "m" (*(unsigned int *)(addr+MCPCIA_BW_IO)), "r" (b)); + *(vuip)(addr+MCPCIA_BW_IO) = b; + mb(); } +#endif -#define inb(port) __inb((port)) -#define inw(port) __inw((port)) -#define inl(port) __inl((port)) - -#define outb(x, port) __outb((x),(port)) -#define outw(x, port) __outw((x),(port)) -#define outl(x, port) __outl((x),(port)) - -#else /* BWIO_ENABLED */ - -extern inline unsigned int __inb(unsigned long in_addr) +__EXTERN_INLINE unsigned int mcpcia_inb(unsigned long in_addr) { unsigned long addr = in_addr & 0xffffffffUL; unsigned long hose = (in_addr >> 32) & 3; - long result = *(vuip) ((addr << 5) + MCPCIA_IO(hose) + 0x00); - result >>= (addr & 3) * 8; - return 0xffUL & result; + long result = *(vip) ((addr << 5) + MCPCIA_IO(hose) + 0x00); + return __kernel_extbl(result, addr & 3); } -extern inline void __outb(unsigned char b, unsigned long in_addr) +__EXTERN_INLINE void mcpcia_outb(unsigned char b, unsigned long in_addr) { unsigned long addr = in_addr & 0xffffffffUL; unsigned long hose = (in_addr >> 32) & 3; unsigned int w; - asm ("insbl %2,%1,%0" : "r="(w) : "ri"(addr & 0x3), "r"(b)); + w = __kernel_insbl(b, addr & 3); *(vuip) ((addr << 5) + MCPCIA_IO(hose) + 0x00) = w; mb(); } -extern inline unsigned int __inw(unsigned long in_addr) +__EXTERN_INLINE unsigned int mcpcia_inw(unsigned long in_addr) { unsigned long addr = in_addr & 0xffffffffUL; unsigned long hose = (in_addr >> 32) & 3; - long result = *(vuip) ((addr << 5) + MCPCIA_IO(hose) + 0x08); - result >>= (addr & 3) * 8; - return 0xffffUL & result; + long result = *(vip) ((addr << 5) + MCPCIA_IO(hose) + 0x08); + return __kernel_extwl(result, addr & 3); } -extern inline void __outw(unsigned short b, unsigned long in_addr) +__EXTERN_INLINE void mcpcia_outw(unsigned short b, unsigned long in_addr) { unsigned long addr = in_addr & 0xffffffffUL; unsigned long hose = (in_addr >> 32) & 3; unsigned int w; - asm ("inswl %2,%1,%0" : "r="(w) : "ri"(addr & 0x3), "r"(b)); + w = __kernel_inswl(b, addr & 3); *(vuip) ((addr << 5) + MCPCIA_IO(hose) + 0x08) = w; mb(); } -extern inline unsigned int __inl(unsigned long in_addr) +__EXTERN_INLINE unsigned int mcpcia_inl(unsigned long in_addr) { unsigned long addr = in_addr & 0xffffffffUL; unsigned long hose = (in_addr >> 32) & 3; return *(vuip) ((addr << 5) + MCPCIA_IO(hose) + 0x18); } -extern inline void __outl(unsigned int b, unsigned long in_addr) +__EXTERN_INLINE void mcpcia_outl(unsigned int b, unsigned long in_addr) { unsigned long addr = in_addr & 0xffffffffUL; unsigned long hose = (in_addr >> 32) & 3; @@ -325,14 +303,6 @@ extern inline void __outl(unsigned int b, unsigned long in_addr) mb(); } -#define inb(port) \ -(__builtin_constant_p((port))?__inb(port):_inb(port)) - -#define outb(x, port) \ -(__builtin_constant_p((port))?__outb((x),(port)):_outb((x),(port))) - -#endif /* BWIO_ENABLED */ - /* * Memory functions. 64-bit and 32-bit accesses are done through @@ -366,303 +336,297 @@ extern inline void __outl(unsigned int b, unsigned long in_addr) * */ -#ifdef DISABLE_BWIO_ENABLED - -extern inline unsigned long __readb(unsigned long addr) +#if 0 /* BWIO */ +__EXTERN_INLINE unsigned long mcpcia_bw_readb(unsigned long addr) { - register unsigned long result; - - __asm__ __volatile__ ( - "ldbu %0,%1" - : "=r" (result) - : "m" (*(unsigned char *)(addr+MCPCIA_BW_MEM))); - - return result; + return __kernel_ldbu(*(vucp)(addr+MCPCIA_BW_MEM)); } -extern inline unsigned long __readw(unsigned long addr) +__EXTERN_INLINE unsigned long mcpcia_bw_readw(unsigned long addr) { - register unsigned long result; - - __asm__ __volatile__ ( - "ldwu %0,%1" - : "=r" (result) - : "m" (*(unsigned short *)(addr+MCPCIA_BW_MEM))); - - return result; + return __kernel_ldbw(*(vusp)(addr+MCPCIA_BW_MEM)); } -extern inline unsigned long __readl(unsigned long addr) +__EXTERN_INLINE unsigned long mcpcia_bw_readl(unsigned long addr) { - register unsigned long result; - - __asm__ __volatile__ ( - "ldl %0,%1" - : "=r" (result) - : "m" (*(unsigned int *)(addr+MCPCIA_BW_MEM))); - - return result; + return *(vuip)(addr + MCPCIA_BW_MEM); } -extern inline void __writeb(unsigned char b, unsigned long addr) +__EXTERN_INLINE unsigned long mcpcia_bw_readq(unsigned long addr) { - __asm__ __volatile__ ( - "stb %1,%0\n\t" - "mb" - : : "m" (*(unsigned char *)(addr+MCPCIA_BW_MEM)), "r" (b)); + return *(vulp)(addr + MCPCIA_BW_MEM); } -extern inline void __writew(unsigned short b, unsigned long addr) +__EXTERN_INLINE void mcpcia_bw_writeb(unsigned char b, unsigned long addr) { - __asm__ __volatile__ ( - "stw %1,%0\n\t" - "mb" - : : "m" (*(unsigned short *)(addr+MCPCIA_BW_MEM)), "r" (b)); + __kernel_stb(b, *(vucp)(addr+MCPCIA_BW_MEM)); } -extern inline void __writel(unsigned int b, unsigned long addr) +__EXTERN_INLINE void mcpcia_bw_writew(unsigned short b, unsigned long addr) { - __asm__ __volatile__ ( - "stl %1,%0\n\t" - "mb" - : : "m" (*(unsigned int *)(addr+MCPCIA_BW_MEM)), "r" (b)); + __kernel_stw(b, *(vusp)(addr+MCPCIA_BW_MEM)); } -#define readb(addr) __readb((addr)) -#define readw(addr) __readw((addr)) - -#define writeb(b, addr) __writeb((b),(addr)) -#define writew(b, addr) __writew((b),(addr)) - -#else /* BWIO_ENABLED */ - -#ifdef CONFIG_ALPHA_SRM_SETUP +__EXTERN_INLINE void mcpcia_bw_writel(unsigned int b, unsigned long addr) +{ + *(vuip)(addr+MCPCIA_BW_MEM) = b; +} -extern unsigned long mcpcia_sm_base_r1, mcpcia_sm_base_r2, mcpcia_sm_base_r3; +__EXTERN_INLINE void mcpcia_bw_writeq(unsigned long b, unsigned long addr) +{ + *(vulp)(addr+MCPCIA_BW_MEM) = b; +} +#endif -extern inline unsigned long __readb(unsigned long addr) +__EXTERN_INLINE unsigned long mcpcia_srm_base(unsigned long addr) { - unsigned long result, shift, work; + unsigned long mask, base; + unsigned long hose = (addr >> 32) & 3; - if ((addr >= mcpcia_sm_base_r1) && - (addr <= (mcpcia_sm_base_r1 + MEM_R1_MASK))) - work = (((addr & MEM_R1_MASK) << 5) + MCPCIA_SPARSE_MEM + 0x00); - else - if ((addr >= mcpcia_sm_base_r2) && - (addr <= (mcpcia_sm_base_r2 + MEM_R2_MASK))) - work = (((addr & MEM_R2_MASK) << 5) + MCPCIA_SPARSE_MEM_R2 + 0x00); - else - if ((addr >= mcpcia_sm_base_r3) && - (addr <= (mcpcia_sm_base_r3 + MEM_R3_MASK))) - work = (((addr & MEM_R3_MASK) << 5) + MCPCIA_SPARSE_MEM_R3 + 0x00); + if (addr >= alpha_mv.sm_base_r1 + && addr <= alpha_mv.sm_base_r1 + MCPCIA_MEM_R1_MASK) { + mask = MCPCIA_MEM_R1_MASK; + base = MCPCIA_SPARSE(hose); + } +#if 0 + /* FIXME FIXME FIXME: SPARSE_MEM_R2 and R3 are not defined? */ + else if (addr >= alpha_mv.sm_base_r2 + && addr <= alpha_mv.sm_base_r2 + MCPCIA_MEM_R2_MASK) { + mask = MCPCIA_MEM_R2_MASK; + base = MCPCIA_SPARSE_MEM_R2; + } + else if (addr >= alpha_mv.sm_base_r3 + && addr <= alpha_mv.sm_base_r3 + MCPCIA_MEM_R3_MASK) { + mask = MCPCIA_MEM_R3_MASK; + base = MCPCIA_SPARSE_MEM_R3; + } +#endif else { #if 0 - printk("__readb: address 0x%lx not covered by HAE\n", addr); + printk("mcpcia: address 0x%lx not covered by HAE\n", addr); #endif - return 0x0ffUL; + return 0; } - shift = (addr & 0x3) << 3; - result = *(vuip) work; - result >>= shift; - return 0x0ffUL & result; + + return ((addr & mask) << 5) + base; } -extern inline unsigned long __readw(unsigned long addr) +__EXTERN_INLINE unsigned long mcpcia_srm_readb(unsigned long addr) { - unsigned long result, shift, work; + unsigned long result, work; - if ((addr >= mcpcia_sm_base_r1) && - (addr <= (mcpcia_sm_base_r1 + MEM_R1_MASK))) - work = (((addr & MEM_R1_MASK) << 5) + MCPCIA_SPARSE_MEM + 0x08); - else - if ((addr >= mcpcia_sm_base_r2) && - (addr <= (mcpcia_sm_base_r2 + MEM_R2_MASK))) - work = (((addr & MEM_R2_MASK) << 5) + MCPCIA_SPARSE_MEM_R2 + 0x08); - else - if ((addr >= mcpcia_sm_base_r3) && - (addr <= (mcpcia_sm_base_r3 + MEM_R3_MASK))) - work = (((addr & MEM_R3_MASK) << 5) + MCPCIA_SPARSE_MEM_R3 + 0x08); - else - { -#if 0 - printk("__readw: address 0x%lx not covered by HAE\n", addr); -#endif - return 0x0ffffUL; - } - shift = (addr & 0x3) << 3; - result = *(vuip) work; - result >>= shift; - return 0x0ffffUL & result; + if ((work = mcpcia_srm_base(addr)) == 0) + return 0xff; + work += 0x00; /* add transfer length */ + + result = *(vip) work; + return __kernel_extbl(result, addr & 3); } -extern inline void __writeb(unsigned char b, unsigned long addr) +__EXTERN_INLINE unsigned long mcpcia_srm_readw(unsigned long addr) { - unsigned long work; + unsigned long result, work; - if ((addr >= mcpcia_sm_base_r1) && - (addr <= (mcpcia_sm_base_r1 + MEM_R1_MASK))) - work = (((addr & MEM_R1_MASK) << 5) + MCPCIA_SPARSE_MEM + 0x00); - else - if ((addr >= mcpcia_sm_base_r2) && - (addr <= (mcpcia_sm_base_r2 + MEM_R2_MASK))) - work = (((addr & MEM_R2_MASK) << 5) + MCPCIA_SPARSE_MEM_R2 + 0x00); - else - if ((addr >= mcpcia_sm_base_r3) && - (addr <= (mcpcia_sm_base_r3 + MEM_R3_MASK))) - work = (((addr & MEM_R3_MASK) << 5) + MCPCIA_SPARSE_MEM_R3 + 0x00); - else - { -#if 0 - printk("__writeb: address 0x%lx not covered by HAE\n", addr); -#endif - return; - } - *(vuip) work = b * 0x01010101; + if ((work = mcpcia_srm_base(addr)) == 0) + return 0xffff; + work += 0x08; /* add transfer length */ + + result = *(vip) work; + return __kernel_extwl(result, addr & 3); } -extern inline void __writew(unsigned short b, unsigned long addr) +__EXTERN_INLINE void mcpcia_srm_writeb(unsigned char b, unsigned long addr) { - unsigned long work; - - if ((addr >= mcpcia_sm_base_r1) && - (addr <= (mcpcia_sm_base_r1 + MEM_R1_MASK))) - work = (((addr & MEM_R1_MASK) << 5) + MCPCIA_SPARSE_MEM + 0x00); - else - if ((addr >= mcpcia_sm_base_r2) && - (addr <= (mcpcia_sm_base_r2 + MEM_R2_MASK))) - work = (((addr & MEM_R2_MASK) << 5) + MCPCIA_SPARSE_MEM_R2 + 0x00); - else - if ((addr >= mcpcia_sm_base_r3) && - (addr <= (mcpcia_sm_base_r3 + MEM_R3_MASK))) - work = (((addr & MEM_R3_MASK) << 5) + MCPCIA_SPARSE_MEM_R3 + 0x00); - else - { -#if 0 - printk("__writew: address 0x%lx not covered by HAE\n", addr); -#endif - return; + unsigned long work = mcpcia_srm_base(addr); + if (work) { + work += 0x00; /* add transfer length */ + *(vuip) work = b * 0x01010101; } - *(vuip) work = b * 0x00010001; } -#else /* SRM_SETUP */ +__EXTERN_INLINE void mcpcia_srm_writew(unsigned short b, unsigned long addr) +{ + unsigned long work = mcpcia_srm_base(addr); + if (work) { + work += 0x08; /* add transfer length */ + *(vuip) work = b * 0x00010001; + } +} -extern inline unsigned long __readb(unsigned long in_addr) +__EXTERN_INLINE unsigned long mcpcia_readb(unsigned long in_addr) { unsigned long addr = in_addr & 0xffffffffUL; unsigned long hose = (in_addr >> 32) & 3; - unsigned long result, shift, msb, work, temp; + unsigned long result, msb, work, temp; - shift = (addr & 0x3) << 3; msb = addr & 0xE0000000UL; - temp = addr & MEM_R1_MASK; - if (msb != hae.cache) { - set_hae(msb); - } + temp = addr & MCPCIA_MEM_R1_MASK; + set_hae(msb); + work = ((temp << 5) + MCPCIA_SPARSE(hose) + 0x00); - result = *(vuip) work; - result >>= shift; - return 0x0ffUL & result; + result = *(vip) work; + return __kernel_extbl(result, addr & 3); } -extern inline unsigned long __readw(unsigned long in_addr) +__EXTERN_INLINE unsigned long mcpcia_readw(unsigned long in_addr) { unsigned long addr = in_addr & 0xffffffffUL; unsigned long hose = (in_addr >> 32) & 3; - unsigned long result, shift, msb, work, temp; + unsigned long result, msb, work, temp; - shift = (addr & 0x3) << 3; msb = addr & 0xE0000000UL; - temp = addr & MEM_R1_MASK ; - if (msb != hae.cache) { - set_hae(msb); - } + temp = addr & MCPCIA_MEM_R1_MASK ; + set_hae(msb); + work = ((temp << 5) + MCPCIA_SPARSE(hose) + 0x08); - result = *(vuip) work; - result >>= shift; - return 0x0ffffUL & result; + result = *(vip) work; + return __kernel_extwl(result, addr & 3); } -extern inline void __writeb(unsigned char b, unsigned long in_addr) +__EXTERN_INLINE void mcpcia_writeb(unsigned char b, unsigned long in_addr) { unsigned long addr = in_addr & 0xffffffffUL; unsigned long hose = (in_addr >> 32) & 3; unsigned long msb; msb = addr & 0xE0000000; - addr &= MEM_R1_MASK; - if (msb != hae.cache) { - set_hae(msb); - } + addr &= MCPCIA_MEM_R1_MASK; + set_hae(msb); + *(vuip) ((addr << 5) + MCPCIA_SPARSE(hose) + 0x00) = b * 0x01010101; } -extern inline void __writew(unsigned short b, unsigned long in_addr) +__EXTERN_INLINE void mcpcia_writew(unsigned short b, unsigned long in_addr) { unsigned long addr = in_addr & 0xffffffffUL; unsigned long hose = (in_addr >> 32) & 3; unsigned long msb ; msb = addr & 0xE0000000 ; - addr &= MEM_R1_MASK ; - if (msb != hae.cache) { - set_hae(msb); - } + addr &= MCPCIA_MEM_R1_MASK ; + set_hae(msb); + *(vuip) ((addr << 5) + MCPCIA_SPARSE(hose) + 0x08) = b * 0x00010001; } -#endif /* SRM_SETUP */ -extern inline unsigned long __readl(unsigned long in_addr) +__EXTERN_INLINE unsigned long mcpcia_readl(unsigned long in_addr) { unsigned long addr = in_addr & 0xffffffffUL; unsigned long hose = (in_addr >> 32) & 3; return *(vuip) (addr + MCPCIA_DENSE(hose)); } -extern inline void __writel(unsigned int b, unsigned long in_addr) +__EXTERN_INLINE unsigned long mcpcia_readq(unsigned long in_addr) +{ + unsigned long addr = in_addr & 0xffffffffUL; + unsigned long hose = (in_addr >> 32) & 3; + return *(vulp) (addr + MCPCIA_DENSE(hose)); +} + +__EXTERN_INLINE void mcpcia_writel(unsigned int b, unsigned long in_addr) { unsigned long addr = in_addr & 0xffffffffUL; unsigned long hose = (in_addr >> 32) & 3; *(vuip) (addr + MCPCIA_DENSE(hose)) = b; } -#endif /* BWIO_ENABLED */ +__EXTERN_INLINE void mcpcia_writeq(unsigned long b, unsigned long in_addr) +{ + unsigned long addr = in_addr & 0xffffffffUL; + unsigned long hose = (in_addr >> 32) & 3; + *(vulp) (addr + MCPCIA_DENSE(hose)) = b; +} -#define readl(a) __readl((unsigned long)(a)) -#define writel(v,a) __writel((v),(unsigned long)(a)) +/* Find the DENSE memory area for a given bus address. */ -#undef vuip +__EXTERN_INLINE unsigned long mcpcia_dense_mem(unsigned long addr) +{ + return MCPCIA_DENSE((addr >> 32) & 3); +} -struct linux_hose_info { - struct pci_bus pci_bus; - struct linux_hose_info *next; - unsigned long pci_io_space; - unsigned long pci_mem_space; - unsigned long pci_config_space; - unsigned long pci_sparse_space; - unsigned int pci_first_busno; - unsigned int pci_last_busno; - unsigned int pci_hose_index; -}; +#undef vucp +#undef vusp +#undef vip +#undef vuip +#undef vulp + +#ifdef __WANT_IO_DEF + +#define virt_to_bus mcpcia_virt_to_bus +#define bus_to_virt mcpcia_bus_to_virt + +#if 0 /* BWIO */ +# define __inb mcpcia_bw_inb +# define __inw mcpcia_bw_inw +# define __inl mcpcia_bw_inl +# define __outb mcpcia_bw_outb +# define __outw mcpcia_bw_outw +# define __outl mcpcia_bw_outl +# define __readb mcpcia_bw_readb +# define __readw mcpcia_bw_readw +# define __writeb mcpcia_bw_writeb +# define __writew mcpcia_bw_writew +# define __readl mcpcia_bw_readl +# define __readq mcpcia_bw_readq +# define __writel mcpcia_bw_writel +# define __writeq mcpcia_bw_writeq +#else +# define __inb mcpcia_inb +# define __inw mcpcia_inw +# define __inl mcpcia_inl +# define __outb mcpcia_outb +# define __outw mcpcia_outw +# define __outl mcpcia_outl +# ifdef CONFIG_ALPHA_SRM_SETUP +# define __readb mcpcia_srm_readb +# define __readw mcpcia_srm_readw +# define __writeb mcpcia_srm_writeb +# define __writew mcpcia_srm_writew +# else +# define __readb mcpcia_readb +# define __readw mcpcia_readw +# define __writeb mcpcia_writeb +# define __writew mcpcia_writew +# endif +# define __readl mcpcia_readl +# define __readq mcpcia_readq +# define __writel mcpcia_writel +# define __writeq mcpcia_writeq +#endif /* BWIO */ + +#define dense_mem mcpcia_dense_mem + +#if 0 /* BWIO */ +# define inb(port) __inb((port)) +# define inw(port) __inw((port)) +# define inl(port) __inl((port)) +# define outb(x, port) __outb((x),(port)) +# define outw(x, port) __outw((x),(port)) +# define outl(x, port) __outl((x),(port)) +# define readb(addr) __readb((addr)) +# define readw(addr) __readw((addr)) +# define writeb(b, addr) __writeb((b),(addr)) +# define writew(b, addr) __writew((b),(addr)) +#else +# define inb(port) \ + (__builtin_constant_p((port))?__inb(port):_inb(port)) +# define outb(x, port) \ + (__builtin_constant_p((port))?__outb((x),(port)):_outb((x),(port))) +#endif /* BWIO */ -extern unsigned long mcpcia_init (unsigned long mem_start, - unsigned long mem_end); -extern unsigned long mcpcia_fixup (unsigned long mem_start, - unsigned long mem_end); +#define readl(a) __readl((unsigned long)(a)) +#define readq(a) __readq((unsigned long)(a)) +#define writel(v,a) __writel((v),(unsigned long)(a)) +#define writeq(v,a) __writeq((v),(unsigned long)(a)) -#endif /* __KERNEL__ */ +#endif /* __WANT_IO_DEF */ -/* - * Data structure for handling MCPCIA machine checks: - */ -struct el_MCPCIA_uncorrected_frame_mcheck { - struct el_common header; - struct el_common_EV5_uncorrectable_mcheck procdata; -}; +#ifdef __IO_EXTERN_INLINE +#undef __EXTERN_INLINE +#undef __IO_EXTERN_INLINE +#endif -#define RTC_PORT(x) (0x70 + (x)) -#define RTC_ADDR(x) (0x80 | (x)) -#define RTC_ALWAYS_BCD 0 +#endif /* __KERNEL__ */ #endif /* __ALPHA_MCPCIA__H__ */ diff --git a/include/asm-alpha/pyxis.h b/include/asm-alpha/core_pyxis.h index d10408bde..8b00d1356 100644 --- a/include/asm-alpha/pyxis.h +++ b/include/asm-alpha/core_pyxis.h @@ -3,6 +3,7 @@ #include <linux/config.h> #include <linux/types.h> +#include <asm/compiler.h> /* * PYXIS is the internal name for a core logic chipset which provides @@ -18,7 +19,7 @@ /*------------------------------------------------------------------------** ** ** -** I/O procedures ** +** I/O procedures ** ** ** ** inport[b|w|t|l], outport[b|w|t|l] 8:16:24:32 IO xfers ** ** inportbxt: 8 bits only ** @@ -69,25 +70,20 @@ * */ -#define BYTE_ENABLE_SHIFT 5 -#define TRANSFER_LENGTH_SHIFT 3 +#define PYXIS_MEM_R1_MASK 0x1fffffff /* SPARSE Mem region 1 mask is 29 bits */ +#define PYXIS_MEM_R2_MASK 0x07ffffff /* SPARSE Mem region 2 mask is 27 bits */ +#define PYXIS_MEM_R3_MASK 0x03ffffff /* SPARSE Mem region 3 mask is 26 bits */ -#define MEM_R1_MASK 0x1fffffff /* SPARSE Mem region 1 mask is 29 bits */ -#define MEM_R2_MASK 0x07ffffff /* SPARSE Mem region 2 mask is 27 bits */ -#define MEM_R3_MASK 0x03ffffff /* SPARSE Mem region 3 mask is 26 bits */ +#define PYXIS_DMA_WIN_BASE_DEFAULT (1024*1024*1024) +#define PYXIS_DMA_WIN_SIZE_DEFAULT (1024*1024*1024) -#ifdef CONFIG_ALPHA_SRM_SETUP -/* if we are using the SRM PCI setup, we'll need to use variables instead */ -#define PYXIS_DMA_WIN_BASE_DEFAULT (1024*1024*1024) -#define PYXIS_DMA_WIN_SIZE_DEFAULT (1024*1024*1024) - -extern unsigned int PYXIS_DMA_WIN_BASE; -extern unsigned int PYXIS_DMA_WIN_SIZE; - -#else /* SRM_SETUP */ -#define PYXIS_DMA_WIN_BASE (1024*1024*1024) -#define PYXIS_DMA_WIN_SIZE (1024*1024*1024) -#endif /* SRM_SETUP */ +#if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_SRM_SETUP) +#define PYXIS_DMA_WIN_BASE alpha_mv.dma_win_base +#define PYXIS_DMA_WIN_SIZE alpha_mv.dma_win_size +#else +#define PYXIS_DMA_WIN_BASE PYXIS_DMA_WIN_BASE_DEFAULT +#define PYXIS_DMA_WIN_SIZE PYXIS_DMA_WIN_SIZE_DEFAULT +#endif /* * General Registers @@ -200,37 +196,90 @@ extern unsigned int PYXIS_DMA_WIN_SIZE; #define PYXIS_STAT0_P_NBR_SHIFT 13 #define PYXIS_STAT0_P_NBR_MASK 0x7ffff -#define HAE_ADDRESS PYXIS_HAE_MEM +#define PYXIS_HAE_ADDRESS PYXIS_HAE_MEM + +/* + * Data structure for handling PYXIS machine checks: + */ +struct el_PYXIS_sysdata_mcheck { + u_long coma_gcr; + u_long coma_edsr; + u_long coma_ter; + u_long coma_elar; + u_long coma_ehar; + u_long coma_ldlr; + u_long coma_ldhr; + u_long coma_base0; + u_long coma_base1; + u_long coma_base2; + u_long coma_cnfg0; + u_long coma_cnfg1; + u_long coma_cnfg2; + u_long epic_dcsr; + u_long epic_pear; + u_long epic_sear; + u_long epic_tbr1; + u_long epic_tbr2; + u_long epic_pbr1; + u_long epic_pbr2; + u_long epic_pmr1; + u_long epic_pmr2; + u_long epic_harx1; + u_long epic_harx2; + u_long epic_pmlt; + u_long epic_tag0; + u_long epic_tag1; + u_long epic_tag2; + u_long epic_tag3; + u_long epic_tag4; + u_long epic_tag5; + u_long epic_tag6; + u_long epic_tag7; + u_long epic_data0; + u_long epic_data1; + u_long epic_data2; + u_long epic_data3; + u_long epic_data4; + u_long epic_data5; + u_long epic_data6; + u_long epic_data7; +}; + #ifdef __KERNEL__ +#ifndef __EXTERN_INLINE +#define __EXTERN_INLINE extern inline +#define __IO_EXTERN_INLINE +#endif + /* * Translate physical memory address as seen on (PCI) bus into * a kernel virtual address and vv. */ -#if defined(CONFIG_ALPHA_RUFFIAN) + /* Ruffian doesn't do 1G PCI window */ -extern inline unsigned long virt_to_bus(void * address) +static inline unsigned long pyxis_ruffian_virt_to_bus(void * address) { return virt_to_phys(address); } -extern inline void * bus_to_virt(unsigned long address) +static inline void * pyxis_ruffian_bus_to_virt(unsigned long address) { return phys_to_virt(address); } -#else /* RUFFIAN */ -extern inline unsigned long virt_to_bus(void * address) + +__EXTERN_INLINE unsigned long pyxis_virt_to_bus(void * address) { return virt_to_phys(address) + PYXIS_DMA_WIN_BASE; } -extern inline void * bus_to_virt(unsigned long address) +__EXTERN_INLINE void * pyxis_bus_to_virt(unsigned long address) { return phys_to_virt(address - PYXIS_DMA_WIN_BASE); } -#endif /* RUFFIAN */ + /* * I/O functions: @@ -241,131 +290,86 @@ extern inline void * bus_to_virt(unsigned long address) * get at PCI memory and I/O. */ +#define vucp volatile unsigned char * +#define vusp volatile unsigned short * +#define vip volatile int * #define vuip volatile unsigned int * +#define vulp volatile unsigned long * -#ifdef BWIO_ENABLED - -extern inline unsigned int __inb(unsigned long addr) +__EXTERN_INLINE unsigned int pyxis_bw_inb(unsigned long addr) { - register unsigned long result; - - __asm__ __volatile__ ( - "ldbu %0,%1" - : "=r" (result) - : "m" (*(unsigned char *)(addr+PYXIS_BW_IO))); - - return result; + return __kernel_ldbu(*(vucp)(addr+PYXIS_BW_IO)); } -extern inline void __outb(unsigned char b, unsigned long addr) +__EXTERN_INLINE void pyxis_bw_outb(unsigned char b, unsigned long addr) { - __asm__ __volatile__ ( - "stb %1,%0\n\t" - "mb" - : : "m" (*(unsigned char *)(addr+PYXIS_BW_IO)), "r" (b)); + __kernel_stb(b, *(vucp)(addr+PYXIS_BW_IO)); + mb(); } -extern inline unsigned int __inw(unsigned long addr) +__EXTERN_INLINE unsigned int pyxis_bw_inw(unsigned long addr) { - register unsigned long result; - - __asm__ __volatile__ ( - "ldwu %0,%1" - : "=r" (result) - : "m" (*(unsigned short *)(addr+PYXIS_BW_IO))); - - return result; + return __kernel_ldwu(*(vusp)(addr+PYXIS_BW_IO)); } -extern inline void __outw(unsigned short b, unsigned long addr) +__EXTERN_INLINE void pyxis_bw_outw(unsigned short b, unsigned long addr) { - __asm__ __volatile__ ( - "stw %1,%0\n\t" - "mb" - : : "m" (*(unsigned short *)(addr+PYXIS_BW_IO)), "r" (b)); + __kernel_stw(b, *(vusp)(addr+PYXIS_BW_IO)); + mb(); } -extern inline unsigned int __inl(unsigned long addr) +__EXTERN_INLINE unsigned int pyxis_bw_inl(unsigned long addr) { - register unsigned long result; - - __asm__ __volatile__ ( - "ldl %0,%1" - : "=r" (result) - : "m" (*(unsigned int *)(addr+PYXIS_BW_IO))); - - return result; + return *(vuip)(addr+PYXIS_BW_IO); } -extern inline void __outl(unsigned int b, unsigned long addr) +__EXTERN_INLINE void pyxis_bw_outl(unsigned int b, unsigned long addr) { - __asm__ __volatile__ ( - "stl %1,%0\n\t" - "mb" - : : "m" (*(unsigned int *)(addr+PYXIS_BW_IO)), "r" (b)); + *(vuip)(addr+PYXIS_BW_IO) = b; + mb(); } -#define inb(port) __inb((port)) -#define inw(port) __inw((port)) -#define inl(port) __inl((port)) - -#define outb(x, port) __outb((x),(port)) -#define outw(x, port) __outw((x),(port)) -#define outl(x, port) __outl((x),(port)) - -#else /* BWIO_ENABLED */ - -extern inline unsigned int __inb(unsigned long addr) +__EXTERN_INLINE unsigned int pyxis_inb(unsigned long addr) { - long result = *(vuip) ((addr << 5) + PYXIS_IO + 0x00); - result >>= (addr & 3) * 8; - return 0xffUL & result; + long result = *(vip) ((addr << 5) + PYXIS_IO + 0x00); + return __kernel_extbl(result, addr & 3); } -extern inline void __outb(unsigned char b, unsigned long addr) +__EXTERN_INLINE void pyxis_outb(unsigned char b, unsigned long addr) { unsigned int w; - asm ("insbl %2,%1,%0" : "r="(w) : "ri"(addr & 0x3), "r"(b)); + w = __kernel_insbl(b, addr & 3); *(vuip) ((addr << 5) + PYXIS_IO + 0x00) = w; mb(); } -extern inline unsigned int __inw(unsigned long addr) +__EXTERN_INLINE unsigned int pyxis_inw(unsigned long addr) { - long result = *(vuip) ((addr << 5) + PYXIS_IO + 0x08); - result >>= (addr & 3) * 8; - return 0xffffUL & result; + long result = *(vip) ((addr << 5) + PYXIS_IO + 0x08); + return __kernel_extwl(result, addr & 3); } -extern inline void __outw(unsigned short b, unsigned long addr) +__EXTERN_INLINE void pyxis_outw(unsigned short b, unsigned long addr) { unsigned int w; - asm ("inswl %2,%1,%0" : "r="(w) : "ri"(addr & 0x3), "r"(b)); + w = __kernel_inswl(b, addr & 3); *(vuip) ((addr << 5) + PYXIS_IO + 0x08) = w; mb(); } -extern inline unsigned int __inl(unsigned long addr) +__EXTERN_INLINE unsigned int pyxis_inl(unsigned long addr) { return *(vuip) ((addr << 5) + PYXIS_IO + 0x18); } -extern inline void __outl(unsigned int b, unsigned long addr) +__EXTERN_INLINE void pyxis_outl(unsigned int b, unsigned long addr) { *(vuip) ((addr << 5) + PYXIS_IO + 0x18) = b; mb(); } -#define inb(port) \ -(__builtin_constant_p((port))?__inb(port):_inb(port)) - -#define outb(x, port) \ -(__builtin_constant_p((port))?__outb((x),(port)):_outb((x),(port))) - -#endif /* BWIO_ENABLED */ - /* * Memory functions. 64-bit and 32-bit accesses are done through @@ -399,316 +403,282 @@ extern inline void __outl(unsigned int b, unsigned long addr) * */ -#ifdef BWIO_ENABLED - -extern inline unsigned long __readb(unsigned long addr) +__EXTERN_INLINE unsigned long pyxis_bw_readb(unsigned long addr) { - register unsigned long result; - - __asm__ __volatile__ ( - "ldbu %0,%1" - : "=r" (result) - : "m" (*(unsigned char *)(addr+PYXIS_BW_MEM))); - - return result; + return __kernel_ldbu(*(vucp)(addr+PYXIS_BW_MEM)); } -extern inline unsigned long __readw(unsigned long addr) +__EXTERN_INLINE unsigned long pyxis_bw_readw(unsigned long addr) { - register unsigned long result; - - __asm__ __volatile__ ( - "ldwu %0,%1" - : "=r" (result) - : "m" (*(unsigned short *)(addr+PYXIS_BW_MEM))); - - return result; + return __kernel_ldwu(*(vusp)(addr+PYXIS_BW_MEM)); } -extern inline unsigned long __readl(unsigned long addr) +__EXTERN_INLINE unsigned long pyxis_bw_readl(unsigned long addr) { - register unsigned long result; - - __asm__ __volatile__ ( - "ldl %0,%1" - : "=r" (result) - : "m" (*(unsigned int *)(addr+PYXIS_BW_MEM))); - - return result; + return *(vuip)(addr+PYXIS_BW_MEM); } -extern inline void __writeb(unsigned char b, unsigned long addr) +__EXTERN_INLINE unsigned long pyxis_bw_readq(unsigned long addr) { - __asm__ __volatile__ ( - "stb %1,%0\n\t" - "mb" - : : "m" (*(unsigned char *)(addr+PYXIS_BW_MEM)), "r" (b)); + return *(vulp)(addr+PYXIS_BW_MEM); } -extern inline void __writew(unsigned short b, unsigned long addr) +__EXTERN_INLINE void pyxis_bw_writeb(unsigned char b, unsigned long addr) { - __asm__ __volatile__ ( - "stw %1,%0\n\t" - "mb" - : : "m" (*(unsigned short *)(addr+PYXIS_BW_MEM)), "r" (b)); + __kernel_stb(b, *(vucp)(addr+PYXIS_BW_MEM)); + mb(); } -extern inline void __writel(unsigned int b, unsigned long addr) +__EXTERN_INLINE void pyxis_bw_writew(unsigned short b, unsigned long addr) { - __asm__ __volatile__ ( - "stl %1,%0\n\t" - "mb" - : : "m" (*(unsigned int *)(addr+PYXIS_BW_MEM)), "r" (b)); + __kernel_stw(b, *(vusp)(addr+PYXIS_BW_MEM)); + mb(); } -#define readb(addr) __readb((addr)) -#define readw(addr) __readw((addr)) - -#define writeb(b, addr) __writeb((b),(addr)) -#define writew(b, addr) __writew((b),(addr)) - -#else /* BWIO_ENABLED */ - -#ifdef CONFIG_ALPHA_SRM_SETUP +__EXTERN_INLINE void pyxis_bw_writel(unsigned int b, unsigned long addr) +{ + *(vuip)(addr+PYXIS_BW_MEM) = b; +} -extern unsigned long pyxis_sm_base_r1, pyxis_sm_base_r2, pyxis_sm_base_r3; +__EXTERN_INLINE void pyxis_bw_writeq(unsigned long b, unsigned long addr) +{ + *(vulp)(addr+PYXIS_BW_MEM) = b; +} -extern inline unsigned long __readb(unsigned long addr) +__EXTERN_INLINE unsigned long pyxis_srm_base(unsigned long addr) { - unsigned long result, shift, work; + unsigned long mask, base; - if ((addr >= pyxis_sm_base_r1) && - (addr <= (pyxis_sm_base_r1 + MEM_R1_MASK))) - work = (((addr & MEM_R1_MASK) << 5) + PYXIS_SPARSE_MEM + 0x00); - else - if ((addr >= pyxis_sm_base_r2) && - (addr <= (pyxis_sm_base_r2 + MEM_R2_MASK))) - work = (((addr & MEM_R2_MASK) << 5) + PYXIS_SPARSE_MEM_R2 + 0x00); - else - if ((addr >= pyxis_sm_base_r3) && - (addr <= (pyxis_sm_base_r3 + MEM_R3_MASK))) - work = (((addr & MEM_R3_MASK) << 5) + PYXIS_SPARSE_MEM_R3 + 0x00); + if (addr >= alpha_mv.sm_base_r1 + && addr <= alpha_mv.sm_base_r1 + PYXIS_MEM_R1_MASK) { + mask = PYXIS_MEM_R1_MASK; + base = PYXIS_SPARSE_MEM; + } + else if (addr >= alpha_mv.sm_base_r2 + && addr <= alpha_mv.sm_base_r2 + PYXIS_MEM_R2_MASK) { + mask = PYXIS_MEM_R2_MASK; + base = PYXIS_SPARSE_MEM_R2; + } + else if (addr >= alpha_mv.sm_base_r3 + && addr <= alpha_mv.sm_base_r3 + PYXIS_MEM_R3_MASK) { + mask = PYXIS_MEM_R3_MASK; + base = PYXIS_SPARSE_MEM_R3; + } else { #if 0 - printk("__readb: address 0x%lx not covered by HAE\n", addr); + printk("pyxis: address 0x%lx not covered by HAE\n", addr); #endif - return 0x0ffUL; + return 0; } - shift = (addr & 0x3) << 3; - result = *(vuip) work; - result >>= shift; - return 0x0ffUL & result; + + return ((addr & mask) << 5) + base; } -extern inline unsigned long __readw(unsigned long addr) +__EXTERN_INLINE unsigned long pyxis_srm_readb(unsigned long addr) { - unsigned long result, shift, work; + unsigned long result, work; - if ((addr >= pyxis_sm_base_r1) && - (addr <= (pyxis_sm_base_r1 + MEM_R1_MASK))) - work = (((addr & MEM_R1_MASK) << 5) + PYXIS_SPARSE_MEM + 0x08); - else - if ((addr >= pyxis_sm_base_r2) && - (addr <= (pyxis_sm_base_r2 + MEM_R2_MASK))) - work = (((addr & MEM_R2_MASK) << 5) + PYXIS_SPARSE_MEM_R2 + 0x08); - else - if ((addr >= pyxis_sm_base_r3) && - (addr <= (pyxis_sm_base_r3 + MEM_R3_MASK))) - work = (((addr & MEM_R3_MASK) << 5) + PYXIS_SPARSE_MEM_R3 + 0x08); - else - { -#if 0 - printk("__readw: address 0x%lx not covered by HAE\n", addr); -#endif - return 0x0ffffUL; - } - shift = (addr & 0x3) << 3; - result = *(vuip) work; - result >>= shift; - return 0x0ffffUL & result; + if ((work = pyxis_srm_base(addr)) == 0) + return 0xff; + work += 0x00; /* add transfer length */ + + result = *(vip) work; + return __kernel_extbl(result, addr & 3); } -extern inline void __writeb(unsigned char b, unsigned long addr) +__EXTERN_INLINE unsigned long pyxis_srm_readw(unsigned long addr) { - unsigned long work; + unsigned long result, work; - if ((addr >= pyxis_sm_base_r1) && - (addr <= (pyxis_sm_base_r1 + MEM_R1_MASK))) - work = (((addr & MEM_R1_MASK) << 5) + PYXIS_SPARSE_MEM + 0x00); - else - if ((addr >= pyxis_sm_base_r2) && - (addr <= (pyxis_sm_base_r2 + MEM_R2_MASK))) - work = (((addr & MEM_R2_MASK) << 5) + PYXIS_SPARSE_MEM_R2 + 0x00); - else - if ((addr >= pyxis_sm_base_r3) && - (addr <= (pyxis_sm_base_r3 + MEM_R3_MASK))) - work = (((addr & MEM_R3_MASK) << 5) + PYXIS_SPARSE_MEM_R3 + 0x00); - else - { -#if 0 - printk("__writeb: address 0x%lx not covered by HAE\n", addr); -#endif - return; - } - *(vuip) work = b * 0x01010101; + if ((work = pyxis_srm_base(addr)) == 0) + return 0xffff; + work += 0x08; /* add transfer length */ + + result = *(vip) work; + return __kernel_extwl(result, addr & 3); } -extern inline void __writew(unsigned short b, unsigned long addr) +__EXTERN_INLINE void pyxis_srm_writeb(unsigned char b, unsigned long addr) { - unsigned long work; - - if ((addr >= pyxis_sm_base_r1) && - (addr <= (pyxis_sm_base_r1 + MEM_R1_MASK))) - work = (((addr & MEM_R1_MASK) << 5) + PYXIS_SPARSE_MEM + 0x00); - else - if ((addr >= pyxis_sm_base_r2) && - (addr <= (pyxis_sm_base_r2 + MEM_R2_MASK))) - work = (((addr & MEM_R2_MASK) << 5) + PYXIS_SPARSE_MEM_R2 + 0x00); - else - if ((addr >= pyxis_sm_base_r3) && - (addr <= (pyxis_sm_base_r3 + MEM_R3_MASK))) - work = (((addr & MEM_R3_MASK) << 5) + PYXIS_SPARSE_MEM_R3 + 0x00); - else - { -#if 0 - printk("__writew: address 0x%lx not covered by HAE\n", addr); -#endif - return; + unsigned long work = pyxis_srm_base(addr); + if (work) { + work += 0x00; /* add transfer length */ + *(vuip) work = b * 0x01010101; } - *(vuip) work = b * 0x00010001; } -#else /* SRM_SETUP */ +__EXTERN_INLINE void pyxis_srm_writew(unsigned short b, unsigned long addr) +{ + unsigned long work = pyxis_srm_base(addr); + if (work) { + work += 0x08; /* add transfer length */ + *(vuip) work = b * 0x00010001; + } +} -extern inline unsigned long __readb(unsigned long addr) +__EXTERN_INLINE unsigned long pyxis_readb(unsigned long addr) { - unsigned long result, shift, msb, work, temp; + unsigned long result, msb, work, temp; - shift = (addr & 0x3) << 3; msb = addr & 0xE0000000UL; - temp = addr & MEM_R1_MASK ; - if (msb != hae.cache) { - set_hae(msb); - } + temp = addr & PYXIS_MEM_R1_MASK ; + set_hae(msb); + work = ((temp << 5) + PYXIS_SPARSE_MEM + 0x00); - result = *(vuip) work; - result >>= shift; - return 0x0ffUL & result; + result = *(vip) work; + return __kernel_extbl(result, addr & 3); } -extern inline unsigned long __readw(unsigned long addr) +__EXTERN_INLINE unsigned long pyxis_readw(unsigned long addr) { - unsigned long result, shift, msb, work, temp; + unsigned long result, msb, work, temp; - shift = (addr & 0x3) << 3; msb = addr & 0xE0000000UL; - temp = addr & MEM_R1_MASK ; - if (msb != hae.cache) { - set_hae(msb); - } + temp = addr & PYXIS_MEM_R1_MASK ; + set_hae(msb); + work = ((temp << 5) + PYXIS_SPARSE_MEM + 0x08); - result = *(vuip) work; - result >>= shift; - return 0x0ffffUL & result; + result = *(vip) work; + return __kernel_extwl(result, addr & 3); } -extern inline void __writeb(unsigned char b, unsigned long addr) +__EXTERN_INLINE void pyxis_writeb(unsigned char b, unsigned long addr) { unsigned long msb ; msb = addr & 0xE0000000 ; - addr &= MEM_R1_MASK ; - if (msb != hae.cache) { - set_hae(msb); - } + addr &= PYXIS_MEM_R1_MASK ; + set_hae(msb); + *(vuip) ((addr << 5) + PYXIS_SPARSE_MEM + 0x00) = b * 0x01010101; } -extern inline void __writew(unsigned short b, unsigned long addr) +__EXTERN_INLINE void pyxis_writew(unsigned short b, unsigned long addr) { unsigned long msb ; msb = addr & 0xE0000000 ; - addr &= MEM_R1_MASK ; - if (msb != hae.cache) { - set_hae(msb); - } + addr &= PYXIS_MEM_R1_MASK ; + set_hae(msb); + *(vuip) ((addr << 5) + PYXIS_SPARSE_MEM + 0x08) = b * 0x00010001; } -#endif /* SRM_SETUP */ -extern inline unsigned long __readl(unsigned long addr) +__EXTERN_INLINE unsigned long pyxis_readl(unsigned long addr) { return *(vuip) (addr + PYXIS_DENSE_MEM); } -extern inline void __writel(unsigned int b, unsigned long addr) +__EXTERN_INLINE unsigned long pyxis_readq(unsigned long addr) +{ + return *(vulp) (addr + PYXIS_DENSE_MEM); +} + +__EXTERN_INLINE void pyxis_writel(unsigned int b, unsigned long addr) { *(vuip) (addr + PYXIS_DENSE_MEM) = b; } -#endif /* BWIO_ENABLED */ +__EXTERN_INLINE void pyxis_writeq(unsigned long b, unsigned long addr) +{ + *(vulp) (addr + PYXIS_DENSE_MEM) = b; +} -#define readl(a) __readl((unsigned long)(a)) -#define writel(v,a) __writel((v),(unsigned long)(a)) +/* Find the DENSE memory area for a given bus address. */ +__EXTERN_INLINE unsigned long pyxis_dense_mem(unsigned long addr) +{ + return PYXIS_DENSE_MEM; +} + +#undef vucp +#undef vusp +#undef vip #undef vuip +#undef vulp -extern unsigned long pyxis_init (unsigned long mem_start, - unsigned long mem_end); +#ifdef __WANT_IO_DEF -#endif /* __KERNEL__ */ +#ifdef CONFIG_ALPHA_RUFFIAN +#define virt_to_bus pyxis_ruffian_virt_to_bus +#define bus_to_virt pyxis_ruffian_bus_to_virt +#else +#define virt_to_bus pyxis_virt_to_bus +#define bus_to_virt pyxis_bus_to_virt +#endif -/* - * Data structure for handling PYXIS machine checks: - */ -struct el_PYXIS_sysdata_mcheck { - u_long coma_gcr; - u_long coma_edsr; - u_long coma_ter; - u_long coma_elar; - u_long coma_ehar; - u_long coma_ldlr; - u_long coma_ldhr; - u_long coma_base0; - u_long coma_base1; - u_long coma_base2; - u_long coma_cnfg0; - u_long coma_cnfg1; - u_long coma_cnfg2; - u_long epic_dcsr; - u_long epic_pear; - u_long epic_sear; - u_long epic_tbr1; - u_long epic_tbr2; - u_long epic_pbr1; - u_long epic_pbr2; - u_long epic_pmr1; - u_long epic_pmr2; - u_long epic_harx1; - u_long epic_harx2; - u_long epic_pmlt; - u_long epic_tag0; - u_long epic_tag1; - u_long epic_tag2; - u_long epic_tag3; - u_long epic_tag4; - u_long epic_tag5; - u_long epic_tag6; - u_long epic_tag7; - u_long epic_data0; - u_long epic_data1; - u_long epic_data2; - u_long epic_data3; - u_long epic_data4; - u_long epic_data5; - u_long epic_data6; - u_long epic_data7; -}; +#ifdef BWIO_ENABLED +# define __inb pyxis_bw_inb +# define __inw pyxis_bw_inw +# define __inl pyxis_bw_inl +# define __outb pyxis_bw_outb +# define __outw pyxis_bw_outw +# define __outl pyxis_bw_outl +# define __readb pyxis_bw_readb +# define __readw pyxis_bw_readw +# define __writeb pyxis_bw_writeb +# define __writew pyxis_bw_writew +# define __readl pyxis_bw_readl +# define __readq pyxis_bw_readq +# define __writel pyxis_bw_writel +# define __writeq pyxis_bw_writeq +#else +# define __inb pyxis_inb +# define __inw pyxis_inw +# define __inl pyxis_inl +# define __outb pyxis_outb +# define __outw pyxis_outw +# define __outl pyxis_outl +# ifdef CONFIG_ALPHA_SRM_SETUP +# define __readb pyxis_srm_readb +# define __readw pyxis_srm_readw +# define __writeb pyxis_srm_writeb +# define __writew pyxis_srm_writew +# else +# define __readb pyxis_readb +# define __readw pyxis_readw +# define __writeb pyxis_writeb +# define __writew pyxis_writew +# endif +# define __readl pyxis_readl +# define __readq pyxis_readq +# define __writel pyxis_writel +# define __writeq pyxis_writeq +#endif /* BWIO */ + +#define dense_mem pyxis_dense_mem + +#ifdef BWIO_ENABLED +# define inb(port) __inb((port)) +# define inw(port) __inw((port)) +# define inl(port) __inl((port)) +# define outb(x, port) __outb((x),(port)) +# define outw(x, port) __outw((x),(port)) +# define outl(x, port) __outl((x),(port)) +# define readb(addr) __readb((addr)) +# define readw(addr) __readw((addr)) +# define writeb(b, addr) __writeb((b),(addr)) +# define writew(b, addr) __writew((b),(addr)) +#else +# define inb(port) \ + (__builtin_constant_p((port))?__inb(port):_inb(port)) +# define outb(x, port) \ + (__builtin_constant_p((port))?__outb((x),(port)):_outb((x),(port))) +#endif /* BWIO */ + +#define readl(a) __readl((unsigned long)(a)) +#define readq(a) __readq((unsigned long)(a)) +#define writel(v,a) __writel((v),(unsigned long)(a)) +#define writeq(v,a) __writeq((v),(unsigned long)(a)) + +#endif /* __WANT_IO_DEF */ -#define RTC_PORT(x) (0x70 + (x)) -#define RTC_ADDR(x) (0x80 | (x)) -#define RTC_ALWAYS_BCD 0 +#ifdef __IO_EXTERN_INLINE +#undef __EXTERN_INLINE +#undef __IO_EXTERN_INLINE +#endif + +#endif /* __KERNEL__ */ #endif /* __ALPHA_PYXIS__H__ */ diff --git a/include/asm-alpha/t2.h b/include/asm-alpha/core_t2.h index 524d6f765..1f0984b38 100644 --- a/include/asm-alpha/t2.h +++ b/include/asm-alpha/core_t2.h @@ -3,6 +3,8 @@ #include <linux/config.h> #include <linux/types.h> +#include <asm/compiler.h> + /* * T2 is the internal name for the core logic chipset which provides @@ -17,29 +19,29 @@ * */ -#define BYTE_ENABLE_SHIFT 5 -#define TRANSFER_LENGTH_SHIFT 3 -#define MEM_R1_MASK 0x03ffffff /* Mem sparse space region 1 mask is 26 bits */ - -#ifdef CONFIG_ALPHA_SRM_SETUP -/* if we are using the SRM PCI setup, we'll need to use variables instead */ -#define T2_DMA_WIN_BASE_DEFAULT (1024*1024*1024) -#define T2_DMA_WIN_SIZE_DEFAULT (1024*1024*1024) +#define T2_MEM_R1_MASK 0x03ffffff /* Mem sparse region 1 mask is 26 bits */ -extern unsigned int T2_DMA_WIN_BASE; -extern unsigned int T2_DMA_WIN_SIZE; +#define T2_DMA_WIN_BASE_DEFAULT (1024*1024*1024) +#define T2_DMA_WIN_SIZE_DEFAULT (1024*1024*1024) -#else /* SRM_SETUP */ -#define T2_DMA_WIN_BASE (1024*1024*1024) -#define T2_DMA_WIN_SIZE (1024*1024*1024) -#endif /* SRM_SETUP */ +#if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_SRM_SETUP) +#define T2_DMA_WIN_BASE alpha_mv.dma_win_base +#define T2_DMA_WIN_SIZE alpha_mv.dma_win_size +#else +#define T2_DMA_WIN_BASE T2_DMA_WIN_BASE_DEFAULT +#define T2_DMA_WIN_SIZE T2_DMA_WIN_SIZE_DEFAULT +#endif /* GAMMA-SABLE is a SABLE with EV5-based CPUs */ -#ifdef CONFIG_ALPHA_GAMMA -# define GAMMA_BIAS 0x8000000000UL -#else /* GAMMA */ -# define GAMMA_BIAS 0x0000000000UL -#endif /* GAMMA */ +#define _GAMMA_BIAS 0x8000000000UL + +#if defined(CONFIG_ALPHA_GENERIC) +#define GAMMA_BIAS alpha_mv.sys.t2.gamma_bias +#elif defined(CONFIG_ALPHA_GAMMA) +#define GAMMA_BIAS _GAMMA_BIAS +#else +#define GAMMA_BIAS 0 +#endif /* * Memory spaces: @@ -70,7 +72,7 @@ extern unsigned int T2_DMA_WIN_SIZE; #define T2_HAE_3 (IDENT_ADDR + GAMMA_BIAS + 0x38e000240UL) #define T2_HAE_4 (IDENT_ADDR + GAMMA_BIAS + 0x38e000260UL) -#define HAE_ADDRESS T2_HAE_1 +#define T2_HAE_ADDRESS T2_HAE_1 /* T2 CSRs are in the non-cachable primary IO space from 3.8000.0000 to 3.8fff.ffff @@ -105,344 +107,17 @@ extern unsigned int T2_DMA_WIN_SIZE; * * */ -#define CPU0_BASE (IDENT_ADDR + GAMMA_BIAS + 0x380000000L) -#define CPU1_BASE (IDENT_ADDR + GAMMA_BIAS + 0x381000000L) -#define CPU2_BASE (IDENT_ADDR + GAMMA_BIAS + 0x382000000L) -#define CPU3_BASE (IDENT_ADDR + GAMMA_BIAS + 0x383000000L) -#define MEM0_BASE (IDENT_ADDR + GAMMA_BIAS + 0x388000000L) -#define MEM1_BASE (IDENT_ADDR + GAMMA_BIAS + 0x389000000L) -#define MEM2_BASE (IDENT_ADDR + GAMMA_BIAS + 0x38a000000L) -#define MEM3_BASE (IDENT_ADDR + GAMMA_BIAS + 0x38b000000L) - -#ifdef __KERNEL__ - -/* - * Translate physical memory address as seen on (PCI) bus into - * a kernel virtual address and vv. - */ -extern inline unsigned long virt_to_bus(void * address) -{ - return virt_to_phys(address) + T2_DMA_WIN_BASE; -} - -extern inline void * bus_to_virt(unsigned long address) -{ - return phys_to_virt(address - T2_DMA_WIN_BASE); -} - -/* - * I/O functions: - * - * T2 (the core logic PCI/memory support chipset for the SABLE - * series of processors uses a sparse address mapping scheme to - * get at PCI memory and I/O. - */ - -#define vuip volatile unsigned int * - -extern inline unsigned int __inb(unsigned long addr) -{ - long result = *(vuip) ((addr << 5) + T2_IO + 0x00); - result >>= (addr & 3) * 8; - return 0xffUL & result; -} - -extern inline void __outb(unsigned char b, unsigned long addr) -{ - unsigned int w; - - asm ("insbl %2,%1,%0" : "r="(w) : "ri"(addr & 0x3), "r"(b)); - *(vuip) ((addr << 5) + T2_IO + 0x00) = w; - mb(); -} - -extern inline unsigned int __inw(unsigned long addr) -{ - long result = *(vuip) ((addr << 5) + T2_IO + 0x08); - result >>= (addr & 3) * 8; - return 0xffffUL & result; -} - -extern inline void __outw(unsigned short b, unsigned long addr) -{ - unsigned int w; - - asm ("inswl %2,%1,%0" : "r="(w) : "ri"(addr & 0x3), "r"(b)); - *(vuip) ((addr << 5) + T2_IO + 0x08) = w; - mb(); -} - -extern inline unsigned int __inl(unsigned long addr) -{ - return *(vuip) ((addr << 5) + T2_IO + 0x18); -} - -extern inline void __outl(unsigned int b, unsigned long addr) -{ - *(vuip) ((addr << 5) + T2_IO + 0x18) = b; - mb(); -} +#define T2_CPU0_BASE (IDENT_ADDR + GAMMA_BIAS + 0x380000000L) +#define T2_CPU1_BASE (IDENT_ADDR + GAMMA_BIAS + 0x381000000L) +#define T2_CPU2_BASE (IDENT_ADDR + GAMMA_BIAS + 0x382000000L) +#define T2_CPU3_BASE (IDENT_ADDR + GAMMA_BIAS + 0x383000000L) +#define T2_MEM0_BASE (IDENT_ADDR + GAMMA_BIAS + 0x388000000L) +#define T2_MEM1_BASE (IDENT_ADDR + GAMMA_BIAS + 0x389000000L) +#define T2_MEM2_BASE (IDENT_ADDR + GAMMA_BIAS + 0x38a000000L) +#define T2_MEM3_BASE (IDENT_ADDR + GAMMA_BIAS + 0x38b000000L) /* - * Memory functions. 64-bit and 32-bit accesses are done through - * dense memory space, everything else through sparse space. - * - * For reading and writing 8 and 16 bit quantities we need to - * go through one of the three sparse address mapping regions - * and use the HAE_MEM CSR to provide some bits of the address. - * The following few routines use only sparse address region 1 - * which gives 1Gbyte of accessible space which relates exactly - * to the amount of PCI memory mapping *into* system address space. - * See p 6-17 of the specification but it looks something like this: - * - * 21164 Address: - * - * 3 2 1 - * 9876543210987654321098765432109876543210 - * 1ZZZZ0.PCI.QW.Address............BBLL - * - * ZZ = SBZ - * BB = Byte offset - * LL = Transfer length - * - * PCI Address: - * - * 3 2 1 - * 10987654321098765432109876543210 - * HHH....PCI.QW.Address........ 00 - * - * HHH = 31:29 HAE_MEM CSR - * - */ -#ifdef CONFIG_ALPHA_SRM_SETUP - -extern unsigned long t2_sm_base; - -extern inline unsigned long __readb(unsigned long addr) -{ - unsigned long result, shift, work; - - if ((addr >= t2_sm_base) && (addr <= (t2_sm_base + MEM_R1_MASK))) - work = (((addr & MEM_R1_MASK) << 5) + T2_SPARSE_MEM + 0x00); - else - if ((addr >= 512*1024) && (addr < 1024*1024)) /* check HOLE */ - work = (((addr & MEM_R1_MASK) << 5) + T2_SPARSE_MEM + 0x00); - else - { -#if 0 - printk("__readb: address 0x%lx not covered by HAE\n", addr); -#endif - return 0x0ffUL; - } - shift = (addr & 0x3) << 3; - result = *(vuip) work; - result >>= shift; - return 0x0ffUL & result; -} - -extern inline unsigned long __readw(unsigned long addr) -{ - unsigned long result, shift, work; - - if ((addr >= t2_sm_base) && (addr <= (t2_sm_base + MEM_R1_MASK))) - work = (((addr & MEM_R1_MASK) << 5) + T2_SPARSE_MEM + 0x08); - else - if ((addr >= 512*1024) && (addr < 1024*1024)) /* check HOLE */ - work = (((addr & MEM_R1_MASK) << 5) + T2_SPARSE_MEM + 0x08); - else - { -#if 0 - printk("__readw: address 0x%lx not covered by HAE\n", addr); -#endif - return 0x0ffffUL; - } - shift = (addr & 0x3) << 3; - result = *(vuip) work; - result >>= shift; - return 0x0ffffUL & result; -} - -/* on SABLE with T2, we must use SPARSE memory even for 32-bit access */ -extern inline unsigned long __readl(unsigned long addr) -{ - unsigned long result, work; - - if ((addr >= t2_sm_base) && (addr <= (t2_sm_base + MEM_R1_MASK))) - work = (((addr & MEM_R1_MASK) << 5) + T2_SPARSE_MEM + 0x18); - else - if ((addr >= 512*1024) && (addr < 1024*1024)) /* check HOLE */ - work = (((addr & MEM_R1_MASK) << 5) + T2_SPARSE_MEM + 0x18); - else - { -#if 0 - printk("__readl: address 0x%lx not covered by HAE\n", addr); -#endif - return 0x0ffffffffUL; - } - result = *(vuip) work; - return 0xffffffffUL & result; -} - -extern inline void __writeb(unsigned char b, unsigned long addr) -{ - unsigned long work; - - if ((addr >= t2_sm_base) && (addr <= (t2_sm_base + MEM_R1_MASK))) - work = (((addr & MEM_R1_MASK) << 5) + T2_SPARSE_MEM + 0x00); - else - if ((addr >= 512*1024) && (addr < 1024*1024)) /* check HOLE */ - work = (((addr & MEM_R1_MASK) << 5) + T2_SPARSE_MEM + 0x00); - else - { -#if 0 - printk("__writeb: address 0x%lx not covered by HAE\n", addr); -#endif - return; - } - *(vuip) work = b * 0x01010101; -} - -extern inline void __writew(unsigned short b, unsigned long addr) -{ - unsigned long work; - - if ((addr >= t2_sm_base) && (addr <= (t2_sm_base + MEM_R1_MASK))) - work = (((addr & MEM_R1_MASK) << 5) + T2_SPARSE_MEM + 0x08); - else - if ((addr >= 512*1024) && (addr < 1024*1024)) /* check HOLE */ - work = (((addr & MEM_R1_MASK) << 5) + T2_SPARSE_MEM + 0x08); - else - { -#if 0 - printk("__writew: address 0x%lx not covered by HAE\n", addr); -#endif - return; - } - *(vuip) work = b * 0x00010001; -} - -/* on SABLE with T2, we must use SPARSE memory even for 32-bit access */ -extern inline void __writel(unsigned int b, unsigned long addr) -{ - unsigned long work; - - if ((addr >= t2_sm_base) && (addr <= (t2_sm_base + MEM_R1_MASK))) - work = (((addr & MEM_R1_MASK) << 5) + T2_SPARSE_MEM + 0x18); - else - if ((addr >= 512*1024) && (addr < 1024*1024)) /* check HOLE */ - work = (((addr & MEM_R1_MASK) << 5) + T2_SPARSE_MEM + 0x18); - { -#if 0 - printk("__writel: address 0x%lx not covered by HAE\n", addr); -#endif - return; - } - *(vuip) work = b; -} - -#else /* SRM_SETUP */ - -extern inline unsigned long __readb(unsigned long addr) -{ - unsigned long result, shift, msb; - - shift = (addr & 0x3) * 8 ; - msb = addr & 0xE0000000 ; - addr &= MEM_R1_MASK ; - if (msb != hae.cache) { - set_hae(msb); - } - result = *(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x00) ; - result >>= shift; - return 0xffUL & result; -} - -extern inline unsigned long __readw(unsigned long addr) -{ - unsigned long result, shift, msb; - - shift = (addr & 0x3) * 8; - msb = addr & 0xE0000000 ; - addr &= MEM_R1_MASK ; - if (msb != hae.cache) { - set_hae(msb); - } - result = *(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x08); - result >>= shift; - return 0xffffUL & result; -} - -/* on SABLE with T2, we must use SPARSE memory even for 32-bit access */ -extern inline unsigned long __readl(unsigned long addr) -{ - unsigned long result, msb; - - msb = addr & 0xE0000000 ; - addr &= MEM_R1_MASK ; - if (msb != hae.cache) { - set_hae(msb); - } - result = *(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x18); - return 0xffffffffUL & result; -} - -extern inline void __writeb(unsigned char b, unsigned long addr) -{ - unsigned long msb ; - - msb = addr & 0xE0000000 ; - addr &= MEM_R1_MASK ; - if (msb != hae.cache) { - set_hae(msb); - } - *(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x00) = b * 0x01010101; -} - -extern inline void __writew(unsigned short b, unsigned long addr) -{ - unsigned long msb ; - - msb = addr & 0xE0000000 ; - addr &= MEM_R1_MASK ; - if (msb != hae.cache) { - set_hae(msb); - } - *(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x08) = b * 0x00010001; -} - -/* on SABLE with T2, we must use SPARSE memory even for 32-bit access */ -extern inline void __writel(unsigned int b, unsigned long addr) -{ - unsigned long msb ; - - msb = addr & 0xE0000000 ; - addr &= MEM_R1_MASK ; - if (msb != hae.cache) { - set_hae(msb); - } - *(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x18) = b; -} - -#endif /* SRM_SETUP */ - -#define inb(port) \ -(__builtin_constant_p((port))?__inb(port):_inb(port)) - -#define outb(x, port) \ -(__builtin_constant_p((port))?__outb((x),(port)):_outb((x),(port))) - -#define readl(a) __readl((unsigned long)(a)) -#define writel(v,a) __writel((v),(unsigned long)(a)) - -#undef vuip - -extern unsigned long t2_init (unsigned long mem_start, - unsigned long mem_end); - -#endif /* __KERNEL__ */ - -/* * Sable CPU Module CSRS * * These are CSRs for hardware other than the CPU chip on the CPU module. @@ -452,22 +127,22 @@ extern unsigned long t2_init (unsigned long mem_start, */ struct sable_cpu_csr { -unsigned long bcc; long fill_00[3]; /* Backup Cache Control */ -unsigned long bcce; long fill_01[3]; /* Backup Cache Correctable Error */ -unsigned long bccea; long fill_02[3]; /* B-Cache Corr Err Address Latch */ -unsigned long bcue; long fill_03[3]; /* B-Cache Uncorrectable Error */ -unsigned long bcuea; long fill_04[3]; /* B-Cache Uncorr Err Addr Latch */ -unsigned long dter; long fill_05[3]; /* Duplicate Tag Error */ -unsigned long cbctl; long fill_06[3]; /* CBus Control */ -unsigned long cbe; long fill_07[3]; /* CBus Error */ -unsigned long cbeal; long fill_08[3]; /* CBus Error Addr Latch low */ -unsigned long cbeah; long fill_09[3]; /* CBus Error Addr Latch high */ -unsigned long pmbx; long fill_10[3]; /* Processor Mailbox */ -unsigned long ipir; long fill_11[3]; /* Inter-Processor Int Request */ -unsigned long sic; long fill_12[3]; /* System Interrupt Clear */ -unsigned long adlk; long fill_13[3]; /* Address Lock (LDxL/STxC) */ -unsigned long madrl; long fill_14[3]; /* CBus Miss Address */ -unsigned long rev; long fill_15[3]; /* CMIC Revision */ + unsigned long bcc; long fill_00[3]; /* Backup Cache Control */ + unsigned long bcce; long fill_01[3]; /* Backup Cache Correctable Error */ + unsigned long bccea; long fill_02[3]; /* B-Cache Corr Err Address Latch */ + unsigned long bcue; long fill_03[3]; /* B-Cache Uncorrectable Error */ + unsigned long bcuea; long fill_04[3]; /* B-Cache Uncorr Err Addr Latch */ + unsigned long dter; long fill_05[3]; /* Duplicate Tag Error */ + unsigned long cbctl; long fill_06[3]; /* CBus Control */ + unsigned long cbe; long fill_07[3]; /* CBus Error */ + unsigned long cbeal; long fill_08[3]; /* CBus Error Addr Latch low */ + unsigned long cbeah; long fill_09[3]; /* CBus Error Addr Latch high */ + unsigned long pmbx; long fill_10[3]; /* Processor Mailbox */ + unsigned long ipir; long fill_11[3]; /* Inter-Processor Int Request */ + unsigned long sic; long fill_12[3]; /* System Interrupt Clear */ + unsigned long adlk; long fill_13[3]; /* Address Lock (LDxL/STxC) */ + unsigned long madrl; long fill_14[3]; /* CBus Miss Address */ + unsigned long rev; long fill_15[3]; /* CMIC Revision */ }; /* @@ -495,7 +170,7 @@ struct el_t2_procdata_mcheck { unsigned long elfmc_biu_stat; /* BIU Status. */ unsigned long elfmc_biu_addr; /* BUI Address. */ unsigned long elfmc_biu_ctl; /* BIU Control. */ - unsigned long elfmc_fill_syndrome; /* For correcting ECC errors. */ + unsigned long elfmc_fill_syndrome; /* For correcting ECC errors. */ unsigned long elfmc_fill_addr;/* Cache block which was being read. */ unsigned long elfmc_va; /* Effective VA of fault or miss. */ unsigned long elfmc_bc_tag; /* Backup Cache Tag Probe Results. */ @@ -507,10 +182,10 @@ struct el_t2_procdata_mcheck { struct el_t2_logout_header { unsigned int elfl_size; /* size in bytes of logout area. */ - int elfl_sbz1:31; /* Should be zero. */ - char elfl_retry:1; /* Retry flag. */ - unsigned int elfl_procoffset; /* Processor-specific offset. */ - unsigned int elfl_sysoffset; /* Offset of system-specific. */ + int elfl_sbz1:31; /* Should be zero. */ + char elfl_retry:1; /* Retry flag. */ + unsigned int elfl_procoffset; /* Processor-specific offset. */ + unsigned int elfl_sysoffset; /* Offset of system-specific. */ unsigned int elfl_error_type; /* PAL error type code. */ unsigned int elfl_frame_rev; /* PAL Frame revision. */ }; @@ -554,7 +229,7 @@ struct el_t2_data_memory { /* - * Sable other cpu error frame - sable pfms section 3.43 + * Sable other CPU error frame - sable pfms section 3.43 */ struct el_t2_data_other_cpu { short elco_cpuid; /* CPU ID */ @@ -578,7 +253,7 @@ struct el_t2_data_other_cpu { }; /* - * Sable other cpu error frame - sable pfms section 3.44 + * Sable other CPU error frame - sable pfms section 3.44 */ struct el_t2_data_t2{ struct el_t2_frame_header elct_hdr; /* ID$T2-FRAME */ @@ -647,8 +322,370 @@ struct el_t2_frame_corrected { }; -#define RTC_PORT(x) (0x70 + (x)) -#define RTC_ADDR(x) (0x80 | (x)) -#define RTC_ALWAYS_BCD 0 +#ifdef __KERNEL__ + +#ifndef __EXTERN_INLINE +#define __EXTERN_INLINE extern inline +#define __IO_EXTERN_INLINE +#endif + +/* + * Translate physical memory address as seen on (PCI) bus into + * a kernel virtual address and vv. + */ + +__EXTERN_INLINE unsigned long t2_virt_to_bus(void * address) +{ + return virt_to_phys(address) + T2_DMA_WIN_BASE; +} + +__EXTERN_INLINE void * t2_bus_to_virt(unsigned long address) +{ + return phys_to_virt(address - T2_DMA_WIN_BASE); +} + +/* + * I/O functions: + * + * T2 (the core logic PCI/memory support chipset for the SABLE + * series of processors uses a sparse address mapping scheme to + * get at PCI memory and I/O. + */ + +#define vip volatile int * +#define vuip volatile unsigned int * + +__EXTERN_INLINE unsigned int t2_inb(unsigned long addr) +{ + long result = *(vip) ((addr << 5) + T2_IO + 0x00); + return __kernel_extbl(result, addr & 3); +} + +__EXTERN_INLINE void t2_outb(unsigned char b, unsigned long addr) +{ + unsigned long w; + + w = __kernel_insbl(b, addr & 3); + *(vuip) ((addr << 5) + T2_IO + 0x00) = w; + mb(); +} + +__EXTERN_INLINE unsigned int t2_inw(unsigned long addr) +{ + long result = *(vip) ((addr << 5) + T2_IO + 0x08); + return __kernel_extwl(result, addr & 3); +} + +__EXTERN_INLINE void t2_outw(unsigned short b, unsigned long addr) +{ + unsigned int w; + + w = __kernel_inswl(b, addr & 3); + *(vuip) ((addr << 5) + T2_IO + 0x08) = w; + mb(); +} + +__EXTERN_INLINE unsigned int t2_inl(unsigned long addr) +{ + return *(vuip) ((addr << 5) + T2_IO + 0x18); +} + +__EXTERN_INLINE void t2_outl(unsigned int b, unsigned long addr) +{ + *(vuip) ((addr << 5) + T2_IO + 0x18) = b; + mb(); +} + + +/* + * Memory functions. 64-bit and 32-bit accesses are done through + * dense memory space, everything else through sparse space. + * + * For reading and writing 8 and 16 bit quantities we need to + * go through one of the three sparse address mapping regions + * and use the HAE_MEM CSR to provide some bits of the address. + * The following few routines use only sparse address region 1 + * which gives 1Gbyte of accessible space which relates exactly + * to the amount of PCI memory mapping *into* system address space. + * See p 6-17 of the specification but it looks something like this: + * + * 21164 Address: + * + * 3 2 1 + * 9876543210987654321098765432109876543210 + * 1ZZZZ0.PCI.QW.Address............BBLL + * + * ZZ = SBZ + * BB = Byte offset + * LL = Transfer length + * + * PCI Address: + * + * 3 2 1 + * 10987654321098765432109876543210 + * HHH....PCI.QW.Address........ 00 + * + * HHH = 31:29 HAE_MEM CSR + * + */ + +__EXTERN_INLINE unsigned long t2_srm_base(unsigned long addr) +{ + if ((addr >= alpha_mv.sm_base_r1 + && addr <= alpha_mv.sm_base_r1 + T2_MEM_R1_MASK) + || (addr >= 512*1024 && addr < 1024*1024)) { + return ((addr & T2_MEM_R1_MASK) << 5) + T2_SPARSE_MEM; + } +#if 0 + printk("T2: address 0x%lx not covered by HAE\n", addr); +#endif + return 0; +} + +__EXTERN_INLINE unsigned long t2_srm_readb(unsigned long addr) +{ + unsigned long result, work; + + if ((work = t2_srm_base(addr)) == 0) + return 0xff; + work += 0x00; /* add transfer length */ + + result = *(vip) work; + return __kernel_extbl(result, addr & 3); +} + +__EXTERN_INLINE unsigned long t2_srm_readw(unsigned long addr) +{ + unsigned long result, work; + + if ((work = t2_srm_base(addr)) == 0) + return 0xffff; + work += 0x08; /* add transfer length */ + + result = *(vip) work; + return __kernel_extwl(result, addr & 3); +} + +/* On SABLE with T2, we must use SPARSE memory even for 32-bit access ... */ +__EXTERN_INLINE unsigned long t2_srm_readl(unsigned long addr) +{ + unsigned long work; + + if ((work = t2_srm_base(addr)) == 0) + return 0xffffffff; + work += 0x18; /* add transfer length */ + + return *(vuip) work; +} + +/* ... which makes me wonder why we advertise we have DENSE memory at all. + Anyway, guess that means we should emulate 64-bit access as two cycles. */ +__EXTERN_INLINE unsigned long t2_srm_readq(unsigned long addr) +{ + unsigned long work, r0, r1; + + if ((work = t2_srm_base(addr)) == 0) + return ~0UL; + work += 0x18; /* add transfer length */ + + r0 = *(vuip) work; + r1 = *(vuip) (work + (4 << 5)); + return r1 << 32 | r0; +} + +__EXTERN_INLINE void t2_srm_writeb(unsigned char b, unsigned long addr) +{ + unsigned long work = t2_srm_base(addr); + if (work) { + work += 0x00; /* add transfer length */ + *(vuip) work = b * 0x01010101; + } +} + +__EXTERN_INLINE void t2_srm_writew(unsigned short b, unsigned long addr) +{ + unsigned long work = t2_srm_base(addr); + if (work) { + work += 0x08; /* add transfer length */ + *(vuip) work = b * 0x00010001; + } +} + +/* On SABLE with T2, we must use SPARSE memory even for 32-bit access ... */ +__EXTERN_INLINE void t2_srm_writel(unsigned int b, unsigned long addr) +{ + unsigned long work = t2_srm_base(addr); + if (work) { + work += 0x18; /* add transfer length */ + *(vuip) work = b; + } +} + +/* ... which makes me wonder why we advertise we have DENSE memory at all. + Anyway, guess that means we should emulate 64-bit access as two cycles. */ +__EXTERN_INLINE void t2_srm_writeq(unsigned long b, unsigned long addr) +{ + unsigned long work = t2_srm_base(addr); + if (work) { + work += 0x18; /* add transfer length */ + *(vuip) work = b; + *(vuip) (work + (4 << 5)) = b >> 32; + } +} + +__EXTERN_INLINE unsigned long t2_readb(unsigned long addr) +{ + unsigned long result, msb; + + msb = addr & 0xE0000000 ; + addr &= T2_MEM_R1_MASK ; + set_hae(msb); + + result = *(vip) ((addr << 5) + T2_SPARSE_MEM + 0x00) ; + return __kernel_extbl(result, addr & 3); +} + +__EXTERN_INLINE unsigned long t2_readw(unsigned long addr) +{ + unsigned long result, msb; + + msb = addr & 0xE0000000 ; + addr &= T2_MEM_R1_MASK ; + set_hae(msb); + + result = *(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x08); + return __kernel_extwl(result, addr & 3); +} + +/* On SABLE with T2, we must use SPARSE memory even for 32-bit access. */ +__EXTERN_INLINE unsigned long t2_readl(unsigned long addr) +{ + unsigned long msb; + + msb = addr & 0xE0000000 ; + addr &= T2_MEM_R1_MASK ; + set_hae(msb); + + return *(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x18); +} + +__EXTERN_INLINE unsigned long t2_readq(unsigned long addr) +{ + unsigned long r0, r1, work, msb; + + msb = addr & 0xE0000000 ; + addr &= T2_MEM_R1_MASK ; + set_hae(msb); + + work = (addr << 5) + T2_SPARSE_MEM + 0x18; + r0 = *(vuip)(work); + r1 = *(vuip)(work + (4 << 5)); + return r1 << 32 | r0; +} + +__EXTERN_INLINE void t2_writeb(unsigned char b, unsigned long addr) +{ + unsigned long msb ; + + msb = addr & 0xE0000000 ; + addr &= T2_MEM_R1_MASK ; + set_hae(msb); + + *(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x00) = b * 0x01010101; +} + +__EXTERN_INLINE void t2_writew(unsigned short b, unsigned long addr) +{ + unsigned long msb ; + + msb = addr & 0xE0000000 ; + addr &= T2_MEM_R1_MASK ; + set_hae(msb); + + *(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x08) = b * 0x00010001; +} + +/* On SABLE with T2, we must use SPARSE memory even for 32-bit access. */ +__EXTERN_INLINE void t2_writel(unsigned int b, unsigned long addr) +{ + unsigned long msb ; + + msb = addr & 0xE0000000 ; + addr &= T2_MEM_R1_MASK ; + set_hae(msb); + + *(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x18) = b; +} + +__EXTERN_INLINE void t2_writeq(unsigned long b, unsigned long addr) +{ + unsigned long msb, work; + + msb = addr & 0xE0000000 ; + addr &= T2_MEM_R1_MASK ; + set_hae(msb); + + work = (addr << 5) + T2_SPARSE_MEM + 0x18; + *(vuip)work = b; + *(vuip)(work + (4 << 5)) = b >> 32; +} + +/* Find the DENSE memory area for a given bus address. */ + +__EXTERN_INLINE unsigned long t2_dense_mem(unsigned long addr) +{ + return T2_DENSE_MEM; +} + +#undef vip +#undef vuip + +#ifdef __WANT_IO_DEF + +#define virt_to_bus t2_virt_to_bus +#define bus_to_virt t2_bus_to_virt +#define __inb t2_inb +#define __inw t2_inw +#define __inl t2_inl +#define __outb t2_outb +#define __outw t2_outw +#define __outl t2_outl + +#ifdef CONFIG_ALPHA_SRM_SETUP +#define __readb t2_srm_readb +#define __readw t2_srm_readw +#define __readl t2_srm_readl +#define __readq t2_srm_readq +#define __writeb t2_srm_writeb +#define __writew t2_srm_writew +#define __writel t2_srm_writel +#define __writeq t2_srm_writeq +#else +#define __readb t2_readb +#define __readw t2_readw +#define __readl t2_readl +#define __readq t2_readq +#define __writeb t2_writeb +#define __writew t2_writew +#define __writel t2_writel +#define __writeq t2_writeq +#endif + +#define dense_mem t2_dense_mem + +#define inb(port) \ +(__builtin_constant_p((port))?__inb(port):_inb(port)) + +#define outb(x, port) \ +(__builtin_constant_p((port))?__outb((x),(port)):_outb((x),(port))) + +#endif /* __WANT_IO_DEF */ + +#ifdef __IO_EXTERN_INLINE +#undef __EXTERN_INLINE +#undef __IO_EXTERN_INLINE +#endif + +#endif /* __KERNEL__ */ #endif /* __ALPHA_T2__H__ */ diff --git a/include/asm-alpha/tsunami.h b/include/asm-alpha/core_tsunami.h index 2c6be4e23..5da9c08bb 100644 --- a/include/asm-alpha/tsunami.h +++ b/include/asm-alpha/core_tsunami.h @@ -3,6 +3,7 @@ #include <linux/config.h> #include <linux/types.h> +#include <asm/compiler.h> /* * TSUNAMI/TYPHOON are the internal names for the core logic chipset which @@ -15,22 +16,18 @@ * */ -#define BYTE_ENABLE_SHIFT 5 -#define TRANSFER_LENGTH_SHIFT 3 - -#ifdef CONFIG_ALPHA_SRM_SETUP -/* if we are using the SRM PCI setup, we'll need to use variables instead */ #define TSUNAMI_DMA_WIN_BASE_DEFAULT (1024*1024*1024) #define TSUNAMI_DMA_WIN_SIZE_DEFAULT (1024*1024*1024) -extern unsigned int TSUNAMI_DMA_WIN_BASE; -extern unsigned int TSUNAMI_DMA_WIN_SIZE; - -#else /* SRM_SETUP */ -#define TSUNAMI_DMA_WIN_BASE (1024*1024*1024) -#define TSUNAMI_DMA_WIN_SIZE (1024*1024*1024) -#endif /* SRM_SETUP */ +#if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_SRM_SETUP) +#define TSUNAMI_DMA_WIN_BASE alpha_mv.dma_win_base +#define TSUNAMI_DMA_WIN_SIZE alpha_mv.dma_win_size +#else +#define TSUNAMI_DMA_WIN_BASE TSUNAMI_DMA_WIN_BASE_DEFAULT +#define TSUNAMI_DMA_WIN_SIZE TSUNAMI_DMA_WIN_SIZE_DEFAULT +#endif +/* XXX: Do we need to conditionalize on this? */ #ifdef USE_48_BIT_KSEG #define TS_BIAS 0x80000000000UL #else @@ -287,20 +284,30 @@ union TPchipPERRMASK { #define TSUNAMI_PCI1_IO (IDENT_ADDR + TS_BIAS + 0x3FC000000UL) #define TSUNAMI_PCI1_CONF (IDENT_ADDR + TS_BIAS + 0x3FE000000UL) -#define HAE_ADDRESS 0 +/* + * Data structure for handling TSUNAMI machine checks: + */ +struct el_TSUNAMI_sysdata_mcheck { +}; + #ifdef __KERNEL__ +#ifndef __EXTERN_INLINE +#define __EXTERN_INLINE extern inline +#define __IO_EXTERN_INLINE +#endif + /* * Translate physical memory address as seen on (PCI) bus into * a kernel virtual address and vv. */ -extern inline unsigned long virt_to_bus(void * address) +__EXTERN_INLINE unsigned long tsunami_virt_to_bus(void * address) { return virt_to_phys(address) + TSUNAMI_DMA_WIN_BASE; } -extern inline void * bus_to_virt(unsigned long address) +__EXTERN_INLINE void * tsunami_bus_to_virt(unsigned long address) { return phys_to_virt(address - TSUNAMI_DMA_WIN_BASE); } @@ -315,138 +322,132 @@ extern inline void * bus_to_virt(unsigned long address) /* HACK ALERT! HACK ALERT! */ /* HACK ALERT! HACK ALERT! */ -/* only using PCI bus 0 for now in all routines */ +/* Only using PCI bus 0 for now in all routines. */ + +#define TSUNAMI_IACK_SC TSUNAMI_PCI0_IACK_SC /* HACK ALERT! HACK ALERT! */ /* HACK ALERT! HACK ALERT! */ - +#define vucp volatile unsigned char * +#define vusp volatile unsigned short * #define vuip volatile unsigned int * +#define vulp volatile unsigned long * -extern inline unsigned int __inb(unsigned long addr) +__EXTERN_INLINE unsigned int tsunami_inb(unsigned long addr) { - register unsigned long result; - - __asm__ __volatile__ ( - "ldbu %0,%1" - : "=r" (result) - : "m" (*(unsigned char *)(addr+TSUNAMI_PCI0_IO))); - - return result; + return __kernel_ldbu(*(vucp)(addr + TSUNAMI_PCI0_IO)); } -extern inline void __outb(unsigned char b, unsigned long addr) +__EXTERN_INLINE void tsunami_outb(unsigned char b, unsigned long addr) { - __asm__ __volatile__ ( - "stb %1,%0\n\t" - "mb" - : : "m" (*(unsigned char *)(addr+TSUNAMI_PCI0_IO)), "r" (b)); + __kernel_stb(b, *(vucp)(addr + TSUNAMI_PCI0_IO)); + mb(); } -extern inline unsigned int __inw(unsigned long addr) +__EXTERN_INLINE unsigned int tsunami_inw(unsigned long addr) { - register unsigned long result; - - __asm__ __volatile__ ( - "ldwu %0,%1" - : "=r" (result) - : "m" (*(unsigned short *)(addr+TSUNAMI_PCI0_IO))); - - return result; + return __kernel_ldwu(*(vusp)(addr+TSUNAMI_PCI0_IO)); } -extern inline void __outw(unsigned short b, unsigned long addr) +__EXTERN_INLINE void tsunami_outw(unsigned short b, unsigned long addr) { - __asm__ __volatile__ ( - "stw %1,%0\n\t" - "mb" - : : "m" (*(unsigned short *)(addr+TSUNAMI_PCI0_IO)), "r" (b)); + __kernel_stw(b, *(vusp)(addr+TSUNAMI_PCI0_IO)); + mb(); } -extern inline unsigned int __inl(unsigned long addr) +__EXTERN_INLINE unsigned int tsunami_inl(unsigned long addr) { - register unsigned long result; - - __asm__ __volatile__ ( - "ldl %0,%1" - : "=r" (result) - : "m" (*(unsigned int *)(addr+TSUNAMI_PCI0_IO))); - - return result; + return *(vuip)(addr+TSUNAMI_PCI0_IO); } -extern inline void __outl(unsigned int b, unsigned long addr) +__EXTERN_INLINE void tsunami_outl(unsigned int b, unsigned long addr) { - __asm__ __volatile__ ( - "stl %1,%0\n\t" - "mb" - : : "m" (*(unsigned int *)(addr+TSUNAMI_PCI0_IO)), "r" (b)); + *(vuip)(addr+TSUNAMI_PCI0_IO) = b; + mb(); } /* * Memory functions. all accesses are done through linear space. */ -extern inline unsigned long __readb(unsigned long addr) +__EXTERN_INLINE unsigned long tsunami_readb(unsigned long addr) { - register unsigned long result; - - __asm__ __volatile__ ( - "ldbu %0,%1" - : "=r" (result) - : "m" (*(unsigned char *)(addr+TSUNAMI_PCI0_MEM))); - - return result; + return __kernel_ldbu(*(vucp)(addr+TSUNAMI_PCI0_MEM)); } -extern inline unsigned long __readw(unsigned long addr) +__EXTERN_INLINE unsigned long tsunami_readw(unsigned long addr) { - register unsigned long result; - - __asm__ __volatile__ ( - "ldwu %0,%1" - : "=r" (result) - : "m" (*(unsigned short *)(addr+TSUNAMI_PCI0_MEM))); + return __kernel_ldwu(*(vusp)(addr+TSUNAMI_PCI0_MEM)); +} - return result; +__EXTERN_INLINE unsigned long tsunami_readl(unsigned long addr) +{ + return *(vuip)(addr+TSUNAMI_PCI0_MEM); } -extern inline unsigned long __readl(unsigned long addr) +__EXTERN_INLINE unsigned long tsunami_readq(unsigned long addr) { - register unsigned long result; + return *(vulp)(addr+TSUNAMI_PCI0_MEM); +} - __asm__ __volatile__ ( - "ldl %0,%1" - : "=r" (result) - : "m" (*(unsigned int *)(addr+TSUNAMI_PCI0_MEM))); +__EXTERN_INLINE void tsunami_writeb(unsigned char b, unsigned long addr) +{ + __kernel_stb(b, *(vucp)(addr+TSUNAMI_PCI0_MEM)); + mb(); +} - return result; +__EXTERN_INLINE void tsunami_writew(unsigned short b, unsigned long addr) +{ + __kernel_stw(b, *(vusp)(addr+TSUNAMI_PCI0_MEM)); + mb(); } -extern inline void __writeb(unsigned char b, unsigned long addr) +__EXTERN_INLINE void tsunami_writel(unsigned int b, unsigned long addr) { - __asm__ __volatile__ ( - "stb %1,%0\n\t" - "mb" - : : "m" (*(unsigned char *)(addr+TSUNAMI_PCI0_MEM)), "r" (b)); + *(vuip)(addr+TSUNAMI_PCI0_MEM) = b; + mb(); } -extern inline void __writew(unsigned short b, unsigned long addr) +__EXTERN_INLINE void tsunami_writeq(unsigned long b, unsigned long addr) { - __asm__ __volatile__ ( - "stw %1,%0\n\t" - "mb" - : : "m" (*(unsigned short *)(addr+TSUNAMI_PCI0_MEM)), "r" (b)); + *(vulp)(addr+TSUNAMI_PCI0_MEM) = b; + mb(); } -extern inline void __writel(unsigned int b, unsigned long addr) +/* Find the DENSE memory area for a given bus address. */ + +__EXTERN_INLINE unsigned long tsunami_dense_mem(unsigned long addr) { - __asm__ __volatile__ ( - "stl %1,%0\n\t" - "mb" - : : "m" (*(unsigned int *)(addr+TSUNAMI_PCI0_MEM)), "r" (b)); + return TSUNAMI_PCI0_MEM; } +#undef vucp +#undef vusp +#undef vuip +#undef vulp + +#ifdef __WANT_IO_DEF + +#define virt_to_bus tsunami_virt_to_bus +#define bus_to_virt tsunami_bus_to_virt + +#define __inb tsunami_inb +#define __inw tsunami_inw +#define __inl tsunami_inl +#define __outb tsunami_outb +#define __outw tsunami_outw +#define __outl tsunami_outl +#define __readb tsunami_readb +#define __readw tsunami_readw +#define __writeb tsunami_writeb +#define __writew tsunami_writew +#define __readl tsunami_readl +#define __readq tsunami_readq +#define __writel tsunami_writel +#define __writeq tsunami_writeq +#define dense_mem tsunami_dense_mem + #define inb(port) __inb((port)) #define inw(port) __inw((port)) #define inl(port) __inl((port)) @@ -458,26 +459,20 @@ extern inline void __writel(unsigned int b, unsigned long addr) #define readb(a) __readb((unsigned long)(a)) #define readw(a) __readw((unsigned long)(a)) #define readl(a) __readl((unsigned long)(a)) +#define readq(a) __readq((unsigned long)(a)) #define writeb(v,a) __writeb((v),(unsigned long)(a)) #define writew(v,a) __writew((v),(unsigned long)(a)) #define writel(v,a) __writel((v),(unsigned long)(a)) +#define writeq(v,a) __writeq((v),(unsigned long)(a)) -#undef vuip +#endif /* __WANT_IO_DEF */ -extern unsigned long tsunami_init (unsigned long mem_start, - unsigned long mem_end); +#ifdef __IO_EXTERN_INLINE +#undef __EXTERN_INLINE +#undef __IO_EXTERN_INLINE +#endif #endif /* __KERNEL__ */ -/* - * Data structure for handling TSUNAMI machine checks: - */ -struct el_TSUNAMI_sysdata_mcheck { -}; - -#define RTC_PORT(x) (0x70 + (x)) -#define RTC_ADDR(x) (0x80 | (x)) -#define RTC_ALWAYS_BCD 0 - #endif /* __ALPHA_TSUNAMI__H__ */ diff --git a/include/asm-alpha/delay.h b/include/asm-alpha/delay.h index df73028c9..87e69f657 100644 --- a/include/asm-alpha/delay.h +++ b/include/asm-alpha/delay.h @@ -35,13 +35,4 @@ extern __inline__ void udelay(unsigned long usecs) __delay(usecs); } -/* - * 64-bit integers means we don't have to worry about overflow as - * on some other architectures.. - */ -extern __inline__ unsigned long muldiv(unsigned long a, unsigned long b, unsigned long c) -{ - return (a*b)/c; -} - #endif /* defined(__ALPHA_DELAY_H) */ diff --git a/include/asm-alpha/dma.h b/include/asm-alpha/dma.h index d8077298d..686921599 100644 --- a/include/asm-alpha/dma.h +++ b/include/asm-alpha/dma.h @@ -19,8 +19,7 @@ #define _ASM_DMA_H #include <linux/config.h> - -#include <asm/io.h> /* need byte IO */ +#include <asm/io.h> #define dma_outb outb #define dma_inb inb @@ -75,7 +74,6 @@ #define MAX_DMA_CHANNELS 8 -#ifdef CONFIG_ALPHA_XL /* The maximum address that we can perform a DMA transfer to on Alpha XL, due to a hardware SIO (PCI<->ISA bus bridge) chip limitation, is 64MB. See <asm/apecs.h> for more info. @@ -86,12 +84,18 @@ We MUST coordinate the maximum with <asm/apecs.h> for consistency. For now, this limit is set to 48Mb... */ -#define MAX_DMA_ADDRESS (0xfffffc0003000000UL) -#else /* CONFIG_ALPHA_XL */ -/* The maximum address that we can perform a DMA transfer to on normal - Alpha platforms */ -#define MAX_DMA_ADDRESS (~0UL) -#endif /* CONFIG_ALPHA_XL */ +#define ALPHA_XL_MAX_DMA_ADDRESS (0xfffffc0003000000UL) +#define ALPHA_MAX_DMA_ADDRESS (~0UL) + +#ifdef CONFIG_ALPHA_GENERIC +# define MAX_DMA_ADDRESS (alpha_mv.max_dma_address) +#else +# ifdef CONFIG_ALPHA_XL +# define MAX_DMA_ADDRESS ALPHA_XL_MAX_DMA_ADDRESS +# else +# define MAX_DMA_ADDRESS ALPHA_MAX_DMA_ADDRESS +# endif +#endif /* 8237 DMA controllers */ #define IO_DMA1_BASE 0x00 /* 8 bit slave DMA, channels 0..3 */ diff --git a/include/asm-alpha/elf.h b/include/asm-alpha/elf.h index 89657ba78..8d614e38f 100644 --- a/include/asm-alpha/elf.h +++ b/include/asm-alpha/elf.h @@ -99,7 +99,7 @@ typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG]; } /* This yields a mask that user programs can use to figure out what - instruction set this cpu supports. This is trivial on Alpha, + instruction set this CPU supports. This is trivial on Alpha, but not so on other machines. */ #define ELF_HWCAP \ diff --git a/include/asm-alpha/floppy.h b/include/asm-alpha/floppy.h index 39c1e491c..2f847ddb0 100644 --- a/include/asm-alpha/floppy.h +++ b/include/asm-alpha/floppy.h @@ -53,13 +53,24 @@ static int FDC2 = -1; #define FLOPPY_MOTOR_MASK 0xf0 /* - * Most Alphas have no problems with floppy DMA crossing 64k borders. Sigh... + * Most Alphas have no problems with floppy DMA crossing 64k borders, + * except for XL. It is also the only one with DMA limits, so we use + * that to test in the generic kernel. */ -#ifdef CONFIG_ALPHA_XL -#define CROSS_64KB(a,s) \ - ((unsigned long)(a)/0x10000 != ((unsigned long)(a) + (s) - 1) / 0x10000) -#else /* CONFIG_ALPHA_XL */ -#define CROSS_64KB(a,s) (0) -#endif /* CONFIG_ALPHA_XL */ + +#define __CROSS_64KB(a,s) \ +({ unsigned long __s64 = (unsigned long)(a); \ + unsigned long __e64 = __s64 + (unsigned long)(s) - 1; \ + (__s64 ^ __e64) & ~0xfffful; }) + +#ifdef CONFIG_ALPHA_GENERIC +# define CROSS_64KB(a,s) (__CROSS_64KB(a,s) && ~alpha_mv.max_dma_address) +#else +# ifdef CONFIG_ALPHA_XL +# define CROSS_64KB(a,s) __CROSS_64KB(a,s) +# else +# define CROSS_64KB(a,s) (0) +# endif +#endif #endif /* __ASM_ALPHA_FLOPPY_H */ diff --git a/include/asm-alpha/hardirq.h b/include/asm-alpha/hardirq.h index 556e744d2..27abc50fa 100644 --- a/include/asm-alpha/hardirq.h +++ b/include/asm-alpha/hardirq.h @@ -4,6 +4,7 @@ #include <linux/tasks.h> extern unsigned int local_irq_count[NR_CPUS]; +#define in_interrupt() (local_irq_count[smp_processor_id()] + local_bh_count[smp_processor_id()] != 0) #ifndef __SMP__ diff --git a/include/asm-alpha/hwrpb.h b/include/asm-alpha/hwrpb.h index 6909f0b6b..5aaf94223 100644 --- a/include/asm-alpha/hwrpb.h +++ b/include/asm-alpha/hwrpb.h @@ -1,5 +1,5 @@ -#ifndef _HWRPB_H -#define _HWRPB_H +#ifndef __ALPHA_HWRPB_H +#define __ALPHA_HWRPB_H #define INIT_HWRPB ((struct hwrpb_struct *) 0x10000000) @@ -34,6 +34,7 @@ #define ST_DEC_AXPPCI_33 11 /* NoName system type */ #define ST_DEC_TLASER 12 /* Turbolaser systype */ #define ST_DEC_2100_A50 13 /* Avanti systype */ +#define ST_DEC_MUSTANG 14 /* Mustang systype */ #define ST_DEC_ALCOR 15 /* Alcor (EV5) systype */ #define ST_DEC_1000 17 /* Mikasa systype */ #define ST_DEC_EB64 18 /* EB64 systype */ @@ -92,7 +93,7 @@ struct percpu_struct { unsigned long halt_pv; unsigned long halt_reason; unsigned long res; - unsigned long ipc_buffer[21]; + char ipc_buffer[168]; unsigned long palcode_avail[16]; unsigned long compatibility; }; @@ -184,4 +185,6 @@ struct hwrpb_struct { unsigned long dsr_offset; /* "Dynamic System Recognition Data Block Table" */ }; -#endif +extern struct hwrpb_struct *hwrpb; + +#endif /* __ALPHA_HWRPB_H */ diff --git a/include/asm-alpha/init.h b/include/asm-alpha/init.h index 9ce618965..7d769dfcd 100644 --- a/include/asm-alpha/init.h +++ b/include/asm-alpha/init.h @@ -7,12 +7,6 @@ __arginit __init; \ __arginit -#if __GNUC__ >= 2 && __GNUC_MINOR__ >= 8 -#define __initlocaldata __initdata -#else -#define __initlocaldata -#endif - /* For assembly routines */ #define __INIT .section .text.init,"ax" #define __FINIT .previous diff --git a/include/asm-alpha/io.h b/include/asm-alpha/io.h index d2668b973..61da10c8e 100644 --- a/include/asm-alpha/io.h +++ b/include/asm-alpha/io.h @@ -2,29 +2,17 @@ #define __ALPHA_IO_H #include <linux/config.h> - #include <asm/system.h> +#include <asm/machvec.h> -/* We don't use IO slowdowns on the alpha, but.. */ +/* We don't use IO slowdowns on the Alpha, but.. */ #define __SLOW_DOWN_IO do { } while (0) #define SLOW_DOWN_IO do { } while (0) /* - * The hae (hardware address extension) register is used to - * access high IO addresses. To avoid doing an external cycle - * every time we need to set the hae, we have a hae cache in - * memory. The kernel entry code makes sure that the hae is - * preserved across interrupts, so it is safe to set the hae - * once and then depend on it staying the same in kernel code. - */ -extern struct hae { - unsigned long cache; - unsigned long *reg; -} hae; - -/* * Virtual -> physical identity mapping starts at this offset */ +/* XXX: Do we need to conditionalize on this? */ #ifdef USE_48_BIT_KSEG #define IDENT_ADDR (0xffff800000000000UL) #else @@ -40,25 +28,34 @@ extern struct hae { * register not being up-to-date with respect to the hardware * value. */ -extern inline void set_hae(unsigned long new_hae) +static inline void __set_hae(unsigned long new_hae) { unsigned long ipl = swpipl(7); - hae.cache = new_hae; - *hae.reg = new_hae; + + alpha_mv.hae_cache = new_hae; + *alpha_mv.hae_register = new_hae; mb(); - new_hae = *hae.reg; /* read to make sure it was written */ + + /* Re-read to make sure it was written. */ + new_hae = *alpha_mv.hae_register; setipl(ipl); } +static inline void set_hae(unsigned long new_hae) +{ + if (new_hae != alpha_mv.hae_cache) + __set_hae(new_hae); +} + /* * Change virtual addresses to physical addresses and vv. */ -extern inline unsigned long virt_to_phys(volatile void * address) +static inline unsigned long virt_to_phys(volatile void * address) { return 0xffffffffUL & (unsigned long) address; } -extern inline void * phys_to_virt(unsigned long address) +static inline void * phys_to_virt(unsigned long address) { return (void *) (address + IDENT_ADDR); } @@ -78,24 +75,77 @@ extern void _sethae (unsigned long addr); /* cached version */ /* * There are different chipsets to interface the Alpha CPUs to the world. */ -#if defined(CONFIG_ALPHA_LCA) -# include <asm/lca.h> /* get chip-specific definitions */ -#elif defined(CONFIG_ALPHA_APECS) -# include <asm/apecs.h> /* get chip-specific definitions */ + +#ifdef CONFIG_ALPHA_GENERIC + +/* In a generic kernel, we always go through the machine vector. */ + +# define virt_to_bus(a) alpha_mv.mv_virt_to_bus(a) +# define bus_to_virt(a) alpha_mv.mv_bus_to_virt(a) + +# define __inb alpha_mv.mv_inb +# define __inw alpha_mv.mv_inw +# define __inl alpha_mv.mv_inl +# define __outb alpha_mv.mv_outb +# define __outw alpha_mv.mv_outw +# define __outl alpha_mv.mv_outl + +# define __readb(a) alpha_mv.mv_readb((unsigned long)(a)) +# define __readw(a) alpha_mv.mv_readw((unsigned long)(a)) +# define __readl(a) alpha_mv.mv_readl((unsigned long)(a)) +# define __readq(a) alpha_mv.mv_readq((unsigned long)(a)) +# define __writeb(v,a) alpha_mv.mv_writeb((v),(unsigned long)(a)) +# define __writew(v,a) alpha_mv.mv_writew((v),(unsigned long)(a)) +# define __writel(v,a) alpha_mv.mv_writel((v),(unsigned long)(a)) +# define __writeq(v,a) alpha_mv.mv_writeq((v),(unsigned long)(a)) + +# define inb __inb +# define inw __inw +# define inl __inl +# define outb __outb +# define outw __outw +# define outl __outl + +# define readb __readb +# define readw __readw +# define readl __readl +# define readq __readq +# define writeb __writeb +# define writew __writew +# define writel __writel +# define writeq __writeq + +# define dense_mem(a) alpha_mv.mv_dense_mem(a) + +#else + +/* Control how and what gets defined within the core logic headers. */ +#define __WANT_IO_DEF + +#if defined(CONFIG_ALPHA_APECS) +# include <asm/core_apecs.h> #elif defined(CONFIG_ALPHA_CIA) -# include <asm/cia.h> /* get chip-specific definitions */ -#elif defined(CONFIG_ALPHA_T2) -# include <asm/t2.h> /* get chip-specific definitions */ +# include <asm/core_cia.h> +#elif defined(CONFIG_ALPHA_LCA) +# include <asm/core_lca.h> +#elif defined(CONFIG_ALPHA_MCPCIA) +# include <asm/core_mcpcia.h> #elif defined(CONFIG_ALPHA_PYXIS) -# include <asm/pyxis.h> /* get chip-specific definitions */ +# include <asm/core_pyxis.h> +#elif defined(CONFIG_ALPHA_T2) +# include <asm/core_t2.h> #elif defined(CONFIG_ALPHA_TSUNAMI) -# include <asm/tsunami.h> /* get chip-specific definitions */ -#elif defined(CONFIG_ALPHA_MCPCIA) -# include <asm/mcpcia.h> /* get chip-specific definitions */ -#else +# include <asm/core_tsunami.h> +#elif defined(CONFIG_ALPHA_JENSEN) # include <asm/jensen.h> +#else +#error "What system is this?" #endif +#undef __WANT_IO_DEF + +#endif /* GENERIC */ + /* * The convention used for inb/outb etc. is that names starting with * two underscores are the inline versions, names starting with a @@ -114,9 +164,11 @@ extern void _outl (unsigned int l,unsigned long port); extern unsigned long _readb(unsigned long addr); extern unsigned long _readw(unsigned long addr); extern unsigned long _readl(unsigned long addr); +extern unsigned long _readq(unsigned long addr); extern void _writeb(unsigned char b, unsigned long addr); extern void _writew(unsigned short b, unsigned long addr); extern void _writel(unsigned int b, unsigned long addr); +extern void _writeq(unsigned long b, unsigned long addr); /* * The platform header files may define some of these macros to use @@ -169,12 +221,12 @@ extern void _writel(unsigned int b, unsigned long addr); * On the alpha, we have the whole physical address space mapped at all * times, so "ioremap()" and "iounmap()" do not need to do anything. */ -extern inline void * ioremap(unsigned long offset, unsigned long size) +static inline void * ioremap(unsigned long offset, unsigned long size) { return (void *) offset; } -extern inline void iounmap(void *addr) +static inline void iounmap(void *addr) { } @@ -187,6 +239,9 @@ extern inline void iounmap(void *addr) #ifndef readl # define readl(a) _readl((unsigned long)(a)) #endif +#ifndef readq +# define readq(a) _readq((unsigned long)(a)) +#endif #ifndef writeb # define writeb(v,a) _writeb((v),(unsigned long)(a)) #endif @@ -196,19 +251,29 @@ extern inline void iounmap(void *addr) #ifndef writel # define writel(v,a) _writel((v),(unsigned long)(a)) #endif +#ifndef writeq +# define writeq(v,a) _writeq((v),(unsigned long)(a)) +#endif #ifdef __KERNEL__ /* * String version of IO memory access ops: */ -extern void _memcpy_fromio(void *, unsigned long, unsigned long); -extern void _memcpy_toio(unsigned long, void *, unsigned long); -extern void _memset_io(unsigned long, int, unsigned long); +extern void _memcpy_fromio(void *, unsigned long, long); +extern void _memcpy_toio(unsigned long, void *, long); +extern void _memset_c_io(unsigned long, unsigned long, long); -#define memcpy_fromio(to,from,len) _memcpy_fromio((to),(unsigned long)(from),(len)) -#define memcpy_toio(to,from,len) _memcpy_toio((unsigned long)(to),(from),(len)) -#define memset_io(addr,c,len) _memset_io((unsigned long)(addr),(c),(len)) +#define memcpy_fromio(to,from,len) \ + _memcpy_fromio((to),(unsigned long)(from),(len)) +#define memcpy_toio(to,from,len) \ + _memcpy_toio((unsigned long)(to),(from),(len)) +#define memset_io(addr,c,len) \ + _memset_c_io((unsigned long)(addr),0x0101010101010101UL*(u8)(c),(len)) + +#define __HAVE_ARCH_MEMSETW_IO +#define memsetw_io(addr,c,len) \ + _memset_c_io((unsigned long)(addr),0x0001000100010001UL*(u16)(c),(len)) /* * String versions of in/out ops: @@ -223,13 +288,15 @@ extern void outsl (unsigned long port, const void *src, unsigned long count); /* * XXX - We don't have csum_partial_copy_fromio() yet, so we cheat here and * just copy it. The net code will then do the checksum later. Presently - * only used by some shared memory 8390 ethernet cards anyway. + * only used by some shared memory 8390 Ethernet cards anyway. */ -#define eth_io_copy_and_sum(skb,src,len,unused) memcpy_fromio((skb)->data,(src),(len)) +#define eth_io_copy_and_sum(skb,src,len,unused) \ + memcpy_fromio((skb)->data,(src),(len)) -static inline int check_signature(unsigned long io_addr, - const unsigned char *signature, int length) +static inline int +check_signature(unsigned long io_addr, const unsigned char *signature, + int length) { int retval = 0; do { @@ -244,6 +311,29 @@ out: return retval; } -#endif /* __KERNEL__ */ +/* + * The Alpha Jensen hardware for some rather strange reason puts + * the RTC clock at 0x170 instead of 0x70. Probably due to some + * misguided idea about using 0x70 for NMI stuff. + * + * These defines will override the defaults when doing RTC queries + */ +#ifdef CONFIG_ALPHA_GENERIC +# define RTC_PORT(x) ((x) + alpha_mv.rtc_port) +# define RTC_ADDR(x) ((x) | alpha_mv.rtc_addr) +#else +# ifdef CONFIG_ALPHA_JENSEN +# define RTC_PORT(x) (0x170+(x)) +# define RTC_ADDR(x) (x) +# else +# define RTC_PORT(x) (0x70 + (x)) +# define RTC_ADDR(x) (0x80 | (x)) +# endif #endif + +#define RTC_ALWAYS_BCD 0 + +#endif /* __KERNEL__ */ + +#endif /* __ALPHA_IO_H */ diff --git a/include/asm-alpha/irq.h b/include/asm-alpha/irq.h index 7140a1437..7f8853c55 100644 --- a/include/asm-alpha/irq.h +++ b/include/asm-alpha/irq.h @@ -10,18 +10,24 @@ #include <linux/linkage.h> #include <linux/config.h> -#if defined(CONFIG_ALPHA_CABRIOLET) || \ +#if defined(CONFIG_ALPHA_GENERIC) + +/* Here NR_IRQS is not exact, but rather an upper bound. This is used + many places throughout the kernel to size static arrays. That's ok, + we'll use alpha_mv.nr_irqs when we want the real thing. */ + +# define NR_IRQS 64 + +#elif defined(CONFIG_ALPHA_CABRIOLET) || \ defined(CONFIG_ALPHA_EB66P) || \ defined(CONFIG_ALPHA_EB164) || \ defined(CONFIG_ALPHA_PC164) || \ - defined(CONFIG_ALPHA_LX164) - + defined(CONFIG_ALPHA_LX164) # define NR_IRQS 35 #elif defined(CONFIG_ALPHA_EB66) || \ defined(CONFIG_ALPHA_EB64P) || \ - defined(CONFIG_ALPHA_MIKASA) - + defined(CONFIG_ALPHA_MIKASA) # define NR_IRQS 32 #elif defined(CONFIG_ALPHA_ALCOR) || \ @@ -29,29 +35,52 @@ defined(CONFIG_ALPHA_MIATA) || \ defined(CONFIG_ALPHA_RUFFIAN) || \ defined(CONFIG_ALPHA_NORITAKE) - # define NR_IRQS 48 #elif defined(CONFIG_ALPHA_SABLE) || \ defined(CONFIG_ALPHA_SX164) - # define NR_IRQS 40 #elif defined(CONFIG_ALPHA_DP264) || \ defined(CONFIG_ALPHA_RAWHIDE) - # define NR_IRQS 64 #elif defined(CONFIG_ALPHA_TAKARA) - # define NR_IRQS 20 #else /* everyone else */ - # define NR_IRQS 16 +#endif + +/* + * PROBE_MASK is the bitset of irqs that we consider for autoprobing. + */ + +/* The normal mask includes all the IRQs except the timer. */ +#define _PROBE_MASK(nr_irqs) (((1UL << (nr_irqs & 63)) - 1) & ~1UL) +/* Mask out unused timer irq 0 and RTC irq 8. */ +#define P2K_PROBE_MASK (_PROBE_MASK(16) & ~0x101UL) + +/* Mask out unused timer irq 0, "irqs" 20-30, and the EISA cascade. */ +#define ALCOR_PROBE_MASK (_PROBE_MASK(48) & ~0xfff000000001UL) + +/* Leave timer irq 0 in the mask. */ +#define RUFFIAN_PROBE_MASK (_PROBE_MASK(48) | 1UL) + +#if defined(CONFIG_ALPHA_GENERIC) +# define PROBE_MASK alpha_mv.irq_probe_mask +#elif defined(CONFIG_ALPHA_P2K) +# define PROBE_MASK P2K_PROBE_MASK +#elif defined(CONFIG_ALPHA_ALCOR) || defined(CONFIG_ALPHA_XLT) +# define PROBE_MASK ALCOR_PROBE_MASK +#elif defined(CONFIG_ALPHA_RUFFIAN) +# define PROBE_MASK RUFFIAN_PROBE_MASK +#else +# define PROBE_MASK _PROBE_MASK(NR_IRQS) #endif + static __inline__ int irq_cannonicalize(int irq) { /* @@ -64,4 +93,4 @@ static __inline__ int irq_cannonicalize(int irq) extern void disable_irq(unsigned int); extern void enable_irq(unsigned int); -#endif +#endif /* _ALPHA_IRQ_H */ diff --git a/include/asm-alpha/jensen.h b/include/asm-alpha/jensen.h index 7a3b07851..75f99ea33 100644 --- a/include/asm-alpha/jensen.h +++ b/include/asm-alpha/jensen.h @@ -1,6 +1,8 @@ #ifndef __ALPHA_JENSEN_H #define __ALPHA_JENSEN_H +#include <asm/compiler.h> + /* * Defines for the AlphaPC EISA IO and memory address space. */ @@ -66,6 +68,14 @@ */ #define EISA_IO (IDENT_ADDR + 0x300000000UL) + +#ifdef __KERNEL__ + +#ifndef __EXTERN_INLINE +#define __EXTERN_INLINE extern inline +#define __IO_EXTERN_INLINE +#endif + /* * Change virtual addresses to bus addresses and vv. * @@ -73,10 +83,16 @@ * as the bus address, but this is not necessarily true on * other alpha hardware. */ -#define virt_to_bus virt_to_phys -#define bus_to_virt phys_to_virt +__EXTERN_INLINE unsigned long jensen_virt_to_bus(void * address) +{ + return virt_to_phys(address); +} + +__EXTERN_INLINE void * jensen_bus_to_virt(unsigned long address) +{ + return phys_to_virt(address); +} -#define HAE_ADDRESS EISA_HAE /* * Handle the "host address register". This needs to be set @@ -86,16 +102,19 @@ * * HAE isn't needed for the local IO operations, though. */ -#define __HAE_MASK 0x1ffffff -extern inline void __set_hae(unsigned long addr) + +#define JENSEN_HAE_ADDRESS EISA_HAE +#define JENSEN_HAE_MASK 0x1ffffff + +__EXTERN_INLINE void jensen_set_hae(unsigned long addr) { /* hae on the Jensen is bits 31:25 shifted right */ addr >>= 25; - if (addr != hae.cache) + if (addr != alpha_mv.hae_cache) set_hae(addr); } -#ifdef __KERNEL__ +#define vuip volatile unsigned int * /* * IO functions @@ -108,36 +127,31 @@ extern inline void __set_hae(unsigned long addr) * gone in the PCI version. I hope I can get DEC suckered^H^H^H^H^H^H^H^H * convinced that I need one of the newer machines. */ -extern inline unsigned int __local_inb(unsigned long addr) + +static inline unsigned int jensen_local_inb(unsigned long addr) { - long result = *(volatile int *) ((addr << 9) + EISA_VL82C106); - return 0xffUL & result; + return 0xff & *(vuip)((addr << 9) + EISA_VL82C106); } -extern inline void __local_outb(unsigned char b, unsigned long addr) +static inline void jensen_local_outb(unsigned char b, unsigned long addr) { - *(volatile unsigned int *) ((addr << 9) + EISA_VL82C106) = b; + *(vuip)((addr << 9) + EISA_VL82C106) = b; mb(); } -extern unsigned int _bus_inb(unsigned long addr); - -extern inline unsigned int __bus_inb(unsigned long addr) +static inline unsigned int jensen_bus_inb(unsigned long addr) { long result; - __set_hae(0); - result = *(volatile int *) ((addr << 7) + EISA_IO + 0x00); - result >>= (addr & 3) * 8; - return 0xffUL & result; + jensen_set_hae(0); + result = *(volatile int *)((addr << 7) + EISA_IO + 0x00); + return __kernel_extbl(result, addr & 3); } -extern void _bus_outb(unsigned char b, unsigned long addr); - -extern inline void __bus_outb(unsigned char b, unsigned long addr) +static inline void jensen_bus_outb(unsigned char b, unsigned long addr) { - __set_hae(0); - *(volatile unsigned int *) ((addr << 7) + EISA_IO + 0x00) = b * 0x01010101; + jensen_set_hae(0); + *(vuip)((addr << 7) + EISA_IO + 0x00) = b * 0x01010101; mb(); } @@ -146,111 +160,165 @@ extern inline void __bus_outb(unsigned char b, unsigned long addr) * operations that result in operations across inline functions. * Which is why this is a macro. */ -#define __is_local(addr) ( \ + +#define jensen_is_local(addr) ( \ /* keyboard */ (addr == 0x60 || addr == 0x64) || \ /* RTC */ (addr == 0x170 || addr == 0x171) || \ /* mb COM2 */ (addr >= 0x2f8 && addr <= 0x2ff) || \ /* mb LPT1 */ (addr >= 0x3bc && addr <= 0x3be) || \ /* mb COM2 */ (addr >= 0x3f8 && addr <= 0x3ff)) -extern inline unsigned int __inb(unsigned long addr) +__EXTERN_INLINE unsigned int jensen_inb(unsigned long addr) { - if (__is_local(addr)) - return __local_inb(addr); - return _bus_inb(addr); + if (jensen_is_local(addr)) + return jensen_local_inb(addr); + else + return jensen_bus_inb(addr); } -extern inline void __outb(unsigned char b, unsigned long addr) +__EXTERN_INLINE void jensen_outb(unsigned char b, unsigned long addr) { - if (__is_local(addr)) - __local_outb(b, addr); + if (jensen_is_local(addr)) + jensen_local_outb(b, addr); else - _bus_outb(b, addr); + jensen_bus_outb(b, addr); } -extern inline unsigned int __inw(unsigned long addr) +__EXTERN_INLINE unsigned int jensen_inw(unsigned long addr) { long result; - __set_hae(0); + jensen_set_hae(0); result = *(volatile int *) ((addr << 7) + EISA_IO + 0x20); result >>= (addr & 3) * 8; return 0xffffUL & result; } -extern inline unsigned int __inl(unsigned long addr) +__EXTERN_INLINE unsigned int jensen_inl(unsigned long addr) { - __set_hae(0); - return *(volatile unsigned int *) ((addr << 7) + EISA_IO + 0x60); + jensen_set_hae(0); + return *(vuip) ((addr << 7) + EISA_IO + 0x60); } -extern inline void __outw(unsigned short b, unsigned long addr) +__EXTERN_INLINE void jensen_outw(unsigned short b, unsigned long addr) { - __set_hae(0); - *(volatile unsigned int *) ((addr << 7) + EISA_IO + 0x20) = b * 0x00010001; + jensen_set_hae(0); + *(vuip) ((addr << 7) + EISA_IO + 0x20) = b * 0x00010001; mb(); } -extern inline void __outl(unsigned int b, unsigned long addr) +__EXTERN_INLINE void jensen_outl(unsigned int b, unsigned long addr) { - __set_hae(0); - *(volatile unsigned int *) ((addr << 7) + EISA_IO + 0x60) = b; + jensen_set_hae(0); + *(vuip) ((addr << 7) + EISA_IO + 0x60) = b; mb(); } /* * Memory functions. */ -extern inline unsigned long __readb(unsigned long addr) + +__EXTERN_INLINE unsigned long jensen_readb(unsigned long addr) { long result; - __set_hae(addr); - addr &= __HAE_MASK; + jensen_set_hae(addr); + addr &= JENSEN_HAE_MASK; result = *(volatile int *) ((addr << 7) + EISA_MEM + 0x00); result >>= (addr & 3) * 8; return 0xffUL & result; } -extern inline unsigned long __readw(unsigned long addr) +__EXTERN_INLINE unsigned long jensen_readw(unsigned long addr) { long result; - __set_hae(addr); - addr &= __HAE_MASK; + jensen_set_hae(addr); + addr &= JENSEN_HAE_MASK; result = *(volatile int *) ((addr << 7) + EISA_MEM + 0x20); result >>= (addr & 3) * 8; return 0xffffUL & result; } -extern inline unsigned long __readl(unsigned long addr) +__EXTERN_INLINE unsigned long jensen_readl(unsigned long addr) +{ + jensen_set_hae(addr); + addr &= JENSEN_HAE_MASK; + return *(vuip) ((addr << 7) + EISA_MEM + 0x60); +} + +__EXTERN_INLINE unsigned long jensen_readq(unsigned long addr) { - __set_hae(addr); - addr &= __HAE_MASK; - return *(volatile unsigned int *) ((addr << 7) + EISA_MEM + 0x60); + unsigned long r0, r1; + + jensen_set_hae(addr); + addr &= JENSEN_HAE_MASK; + addr = (addr << 7) + EISA_MEM + 0x60; + r0 = *(vuip) (addr); + r1 = *(vuip) (addr + (4 << 7)); + return r1 << 32 | r0; } -extern inline void __writeb(unsigned short b, unsigned long addr) +__EXTERN_INLINE void jensen_writeb(unsigned char b, unsigned long addr) { - __set_hae(addr); - addr &= __HAE_MASK; - *(volatile unsigned int *) ((addr << 7) + EISA_MEM + 0x00) = b * 0x01010101; + jensen_set_hae(addr); + addr &= JENSEN_HAE_MASK; + *(vuip) ((addr << 7) + EISA_MEM + 0x00) = b * 0x01010101; } -extern inline void __writew(unsigned short b, unsigned long addr) +__EXTERN_INLINE void jensen_writew(unsigned short b, unsigned long addr) { - __set_hae(addr); - addr &= __HAE_MASK; - *(volatile unsigned int *) ((addr << 7) + EISA_MEM + 0x20) = b * 0x00010001; + jensen_set_hae(addr); + addr &= JENSEN_HAE_MASK; + *(vuip) ((addr << 7) + EISA_MEM + 0x20) = b * 0x00010001; } -extern inline void __writel(unsigned int b, unsigned long addr) +__EXTERN_INLINE void jensen_writel(unsigned int b, unsigned long addr) { - __set_hae(addr); - addr &= __HAE_MASK; - *(volatile unsigned int *) ((addr << 7) + EISA_MEM + 0x60) = b; + jensen_set_hae(addr); + addr &= JENSEN_HAE_MASK; + *(vuip) ((addr << 7) + EISA_MEM + 0x60) = b; } +__EXTERN_INLINE void jensen_writeq(unsigned long b, unsigned long addr) +{ + jensen_set_hae(addr); + addr &= JENSEN_HAE_MASK; + addr = (addr << 7) + EISA_MEM + 0x60; + *(vuip) (addr) = b; + *(vuip) (addr + (4 << 7)) = b >> 32; +} + +/* Find the DENSE memory area for a given bus address. + Whee, there is none. */ + +__EXTERN_INLINE unsigned long jensen_dense_mem(unsigned long addr) +{ + return 0; +} + +#undef vuip + +#ifdef __WANT_IO_DEF + +#define virt_to_bus jensen_virt_to_bus +#define bus_to_virt jensen_bus_to_virt +#define __inb jensen_inb +#define __inw jensen_inw +#define __inl jensen_inl +#define __outb jensen_outb +#define __outw jensen_outw +#define __outl jensen_outl +#define __readb jensen_readb +#define __readw jensen_readw +#define __writeb jensen_writeb +#define __writew jensen_writew +#define __readl jensen_readl +#define __readq jensen_readq +#define __writel jensen_writel +#define __writeq jensen_writeq +#define dense_mem jensen_dense_mem + /* * The above have so much overhead that it probably doesn't make * sense to have them inlined (better icache behaviour). @@ -261,17 +329,13 @@ extern inline void __writel(unsigned int b, unsigned long addr) #define outb(x, port) \ (__builtin_constant_p((port))?__outb((x),(port)):_outb((x),(port))) -#endif /* __KERNEL__ */ - -/* - * The Alpha Jensen hardware for some rather strange reason puts - * the RTC clock at 0x170 instead of 0x70. Probably due to some - * misguided idea about using 0x70 for NMI stuff. - * - * These defines will override the defaults when doing RTC queries - */ -#define RTC_PORT(x) (0x170+(x)) -#define RTC_ADDR(x) (x) -#define RTC_ALWAYS_BCD 0 +#endif /* __WANT_IO_DEF */ +#ifdef __IO_EXTERN_INLINE +#undef __EXTERN_INLINE +#undef __IO_EXTERN_INLINE #endif + +#endif /* __KERNEL__ */ + +#endif /* __ALPHA_JENSEN_H */ diff --git a/include/asm-alpha/linux_logo.h b/include/asm-alpha/linux_logo.h new file mode 100644 index 000000000..c7918fb97 --- /dev/null +++ b/include/asm-alpha/linux_logo.h @@ -0,0 +1,47 @@ +/* $Id: linux_logo.h,v 1.3 1998/06/29 19:36:17 geert Exp $ + * include/asm-alpha/linux_logo.h: This is a linux logo + * to be displayed on boot. + * + * Copyright (C) 1996 Larry Ewing (lewing@isc.tamu.edu) + * Copyright (C) 1996 Jakub Jelinek (jj@sunsite.mff.cuni.cz) + * + * You can put anything here, but: + * LINUX_LOGO_COLORS has to be less than 224 + * image size has to be 80x80 + * values have to start from 0x20 + * (i.e. RGB(linux_logo_red[0], + * linux_logo_green[0], + * linux_logo_blue[0]) is color 0x20) + * BW image has to be 80x80 as well, with MS bit + * on the left + * Serial_console ascii image can be any size, + * but should contain %s to display the version + */ + +#include <linux/init.h> +#include <linux/version.h> + +#define linux_logo_banner "Linux/AXP version " UTS_RELEASE + +#define LINUX_LOGO_COLORS 221 + +#ifdef INCLUDE_LINUX_LOGO_DATA + +#define INCLUDE_LINUX_LOGO16 + +#include <linux/linux_logo.h> + +#else + +/* prototypes only */ +extern unsigned char linux_logo_red[]; +extern unsigned char linux_logo_green[]; +extern unsigned char linux_logo_blue[]; +extern unsigned char linux_logo[]; +extern unsigned char linux_logo_bw[]; +extern unsigned char linux_logo16_red[]; +extern unsigned char linux_logo16_green[]; +extern unsigned char linux_logo16_blue[]; +extern unsigned char linux_logo16[]; + +#endif diff --git a/include/asm-alpha/machvec.h b/include/asm-alpha/machvec.h new file mode 100644 index 000000000..e3d247a9a --- /dev/null +++ b/include/asm-alpha/machvec.h @@ -0,0 +1,118 @@ +#ifndef __ALPHA_MACHVEC_H +#define __ALPHA_MACHVEC_H 1 + +#include <linux/config.h> +#include <linux/types.h> + + +/* The following structure vectors all of the I/O and IRQ manipulation + from the generic kernel to the hardware specific backend. */ + +struct task_struct; +struct mm_struct; +struct pt_regs; +struct vm_area_struct; + +struct alpha_machine_vector +{ + /* This "belongs" down below with the rest of the runtime + variables, but it is convenient for entry.S if these + two slots are at the beginning of the struct. */ + unsigned long hae_cache; + unsigned long *hae_register; + + unsigned long max_dma_address; + unsigned int nr_irqs; + unsigned int rtc_port, rtc_addr; + unsigned int max_asn; + unsigned long mmu_context_mask; + unsigned long irq_probe_mask; + unsigned long iack_sc; + + unsigned long (*mv_virt_to_bus)(void *); + void * (*mv_bus_to_virt)(unsigned long); + + unsigned int (*mv_inb)(unsigned long); + unsigned int (*mv_inw)(unsigned long); + unsigned int (*mv_inl)(unsigned long); + + void (*mv_outb)(unsigned char, unsigned long); + void (*mv_outw)(unsigned short, unsigned long); + void (*mv_outl)(unsigned int, unsigned long); + + unsigned long (*mv_readb)(unsigned long); + unsigned long (*mv_readw)(unsigned long); + unsigned long (*mv_readl)(unsigned long); + unsigned long (*mv_readq)(unsigned long); + + void (*mv_writeb)(unsigned char, unsigned long); + void (*mv_writew)(unsigned short, unsigned long); + void (*mv_writel)(unsigned int, unsigned long); + void (*mv_writeq)(unsigned long, unsigned long); + + unsigned long (*mv_dense_mem)(unsigned long); + + int (*pci_read_config_byte)(u8, u8, u8, u8 *value); + int (*pci_read_config_word)(u8, u8, u8, u16 *value); + int (*pci_read_config_dword)(u8, u8, u8, u32 *value); + + int (*pci_write_config_byte)(u8, u8, u8, u8 value); + int (*pci_write_config_word)(u8, u8, u8, u16 value); + int (*pci_write_config_dword)(u8, u8, u8, u32 value); + + void (*mv_get_mmu_context)(struct task_struct *); + void (*mv_flush_tlb_current)(struct mm_struct *); + void (*mv_flush_tlb_other)(struct mm_struct *); + void (*mv_flush_tlb_current_page)(struct mm_struct * mm, + struct vm_area_struct *vma, + unsigned long addr); + + void (*update_irq_hw)(unsigned long, unsigned long, int); + void (*ack_irq)(unsigned long); + void (*device_interrupt)(unsigned long vector, struct pt_regs *regs); + void (*machine_check)(u64 vector, u64 la, struct pt_regs *regs); + + void (*init_arch)(unsigned long *, unsigned long *); + void (*init_irq)(void); + void (*init_pit)(void); + void (*pci_fixup)(void); + void (*kill_arch)(int, char *); + + const char *vector_name; + + /* System specific parameters. */ + union { + struct { + unsigned long gru_int_req_bits; + } cia; + + struct { + unsigned long gamma_bias; + } t2; + } sys; + + /* Runtime variables it is handy to keep close. */ + unsigned long dma_win_base; + unsigned long dma_win_size; + unsigned long sm_base_r1, sm_base_r2, sm_base_r3; +}; + +extern struct alpha_machine_vector alpha_mv; + +#ifdef CONFIG_ALPHA_GENERIC +extern int alpha_using_srm; +extern int alpha_use_srm_setup; +#else +#ifdef CONFIG_ALPHA_SRM +#define alpha_using_srm 1 +#else +#define alpha_using_srm 0 +#endif +#if defined(CONFIG_ALPHA_SRM_SETUP) +#define alpha_use_srm_setup 1 +#else +#define alpha_use_srm_setup 0 +#endif +#endif /* GENERIC */ + +#endif /* __ALPHA_MACHVEC_H */ diff --git a/include/asm-alpha/md.h b/include/asm-alpha/md.h new file mode 100644 index 000000000..6c9b8222a --- /dev/null +++ b/include/asm-alpha/md.h @@ -0,0 +1,13 @@ +/* $Id: md.h,v 1.1 1997/12/15 15:11:48 jj Exp $ + * md.h: High speed xor_block operation for RAID4/5 + * + */ + +#ifndef __ASM_MD_H +#define __ASM_MD_H + +/* #define HAVE_ARCH_XORBLOCK */ + +#define MD_XORBLOCK_ALIGNMENT sizeof(long) + +#endif /* __ASM_MD_H */ diff --git a/include/asm-alpha/mmu_context.h b/include/asm-alpha/mmu_context.h index 0d4ab6b21..af97b6740 100644 --- a/include/asm-alpha/mmu_context.h +++ b/include/asm-alpha/mmu_context.h @@ -9,6 +9,7 @@ #include <linux/config.h> #include <asm/system.h> +#include <asm/machvec.h> /* * The maximum ASN's the processor supports. On the EV4 this is 63 @@ -32,11 +33,17 @@ * work correctly and can thus not be used (explaining the lack of PAL-code * support). */ -#ifdef CONFIG_ALPHA_EV5 -#define MAX_ASN 127 +#define EV4_MAX_ASN 63 +#define EV5_MAX_ASN 127 + +#ifdef CONFIG_ALPHA_GENERIC +# define MAX_ASN (alpha_mv.max_asn) #else -#define MAX_ASN 63 -#define BROKEN_ASN 1 +# ifdef CONFIG_ALPHA_EV4 +# define MAX_ASN EV4_MAX_ASN +# else +# define MAX_ASN EV5_MAX_ASN +# endif #endif #ifdef __SMP__ @@ -78,26 +85,21 @@ extern unsigned long asn_cache; * force a new asn for any other processes the next time they want to * run. */ -extern inline void -get_new_mmu_context(struct task_struct *p, struct mm_struct *mm) + +#ifndef __EXTERN_INLINE +#define __EXTERN_INLINE extern inline +#define __MMU_EXTERN_INLINE +#endif + +extern void get_new_mmu_context(struct task_struct *p, struct mm_struct *mm); + +__EXTERN_INLINE void ev4_get_mmu_context(struct task_struct *p) { - unsigned long asn = asn_cache; - - if ((asn & HARDWARE_ASN_MASK) < MAX_ASN) - ++asn; - else { - tbiap(); - imb(); - asn = (asn & ~HARDWARE_ASN_MASK) + ASN_FIRST_VERSION; - } - asn_cache = asn; - mm->context = asn; /* full version + asn */ - p->tss.asn = asn & HARDWARE_ASN_MASK; /* just asn */ + /* As described, ASN's are broken. */ } -extern inline void get_mmu_context(struct task_struct *p) +__EXTERN_INLINE void ev5_get_mmu_context(struct task_struct *p) { -#ifndef BROKEN_ASN struct mm_struct * mm = p->mm; if (mm) { @@ -106,27 +108,81 @@ extern inline void get_mmu_context(struct task_struct *p) if ((mm->context ^ asn) & ~HARDWARE_ASN_MASK) get_new_mmu_context(p, mm); } -#endif } +#ifdef CONFIG_ALPHA_GENERIC +# define get_mmu_context (alpha_mv.mv_get_mmu_context) +#else +# ifdef CONFIG_ALPHA_EV4 +# define get_mmu_context ev4_get_mmu_context +# else +# define get_mmu_context ev5_get_mmu_context +# endif +#endif + extern inline void init_new_context(struct mm_struct *mm) { mm->context = 0; } -#define destroy_context(mm) do { } while(0) +extern inline void destroy_context(struct mm_struct *mm) +{ + /* Nothing to do. */ +} + /* - * After we have set current->mm to a new value, this activates - * the context for the new mm so we see the new mappings. - * Ideally this would be an extern inline function, but reload_context - * is declared in pgtable.h, which includes this file. :-( + * Force a context reload. This is needed when we change the page + * table pointer or when we update the ASN of the current process. */ -#define activate_context(tsk) \ - do { \ - get_mmu_context(tsk); \ - reload_context(tsk); \ - } while (0) +#if defined(CONFIG_ALPHA_GENERIC) +#define MASK_CONTEXT(tss) \ + ((struct thread_struct *)((unsigned long)(tss) & alpha_mv.mmu_context_mask)) +#elif defined(CONFIG_ALPHA_DP264) +#define MASK_CONTEXT(tss) \ + ((struct thread_struct *)((unsigned long)(tss) & 0xfffffffffful)) +#else +#define MASK_CONTEXT(tss) (tss) +#endif + +__EXTERN_INLINE struct thread_struct * +__reload_tss(struct thread_struct *tss) +{ + register struct thread_struct *a0 __asm__("$16"); + register struct thread_struct *v0 __asm__("$0"); + + a0 = MASK_CONTEXT(tss); + + __asm__ __volatile__( + "call_pal %2" : "=r"(v0), "=r"(a0) + : "i"(PAL_swpctx), "r"(a0) + : "$1", "$16", "$22", "$23", "$24", "$25"); + + return v0; +} + +__EXTERN_INLINE void +reload_context(struct task_struct *task) +{ + __reload_tss(&task->tss); +} + +/* + * After we have set current->mm to a new value, this activates the + * context for the new mm so we see the new mappings. + */ + +__EXTERN_INLINE void +activate_context(struct task_struct *task) +{ + get_mmu_context(task); + reload_context(task); +} + +#ifdef __MMU_EXTERN_INLINE +#undef __EXTERN_INLINE +#undef __MMU_EXTERN_INLINE #endif +#endif /* __ALPHA_MMU_CONTEXT_H */ diff --git a/include/asm-alpha/page.h b/include/asm-alpha/page.h index e2b61494a..aa2a67ae3 100644 --- a/include/asm-alpha/page.h +++ b/include/asm-alpha/page.h @@ -19,54 +19,51 @@ */ static inline void clear_page(unsigned long page) { - unsigned long count; - __asm__ __volatile__( - ".align 4\n" - "1:\n\t" - "stq $31,0(%1)\n\t" - "stq $31,8(%1)\n\t" - "stq $31,16(%1)\n\t" - "stq $31,24(%1)\n\t" - "subq %0,1,%0\n\t" - "stq $31,32(%1)\n\t" - "stq $31,40(%1)\n\t" - "stq $31,48(%1)\n\t" - "stq $31,56(%1)\n\t" - "addq $1,64,$1\n\t" - "bne %0,1b" - :"=r" (count),"=r" (page) - :"0" (PAGE_SIZE/64), "1" (page)); + unsigned long count = PAGE_SIZE/64; + unsigned long *ptr = (unsigned long *)page; + + do { + ptr[0] = 0; + ptr[1] = 0; + ptr[2] = 0; + ptr[3] = 0; + count--; + ptr[4] = 0; + ptr[5] = 0; + ptr[6] = 0; + ptr[7] = 0; + ptr += 8; + } while (count); } -static inline void copy_page(unsigned long to, unsigned long from) +static inline void copy_page(unsigned long _to, unsigned long _from) { - unsigned long count; - __asm__ __volatile__( - ".align 4\n" - "1:\n\t" - "ldq $0,0(%1)\n\t" - "ldq $1,8(%1)\n\t" - "ldq $2,16(%1)\n\t" - "ldq $3,24(%1)\n\t" - "ldq $4,32(%1)\n\t" - "ldq $5,40(%1)\n\t" - "ldq $6,48(%1)\n\t" - "ldq $7,56(%1)\n\t" - "subq %0,1,%0\n\t" - "addq %1,64,%1\n\t" - "stq $0,0(%2)\n\t" - "stq $1,8(%2)\n\t" - "stq $2,16(%2)\n\t" - "stq $3,24(%2)\n\t" - "stq $4,32(%2)\n\t" - "stq $5,40(%2)\n\t" - "stq $6,48(%2)\n\t" - "stq $7,56(%2)\n\t" - "addq %2,64,%2\n\t" - "bne %0,1b" - :"=r" (count), "=r" (from), "=r" (to) - :"0" (PAGE_SIZE/64), "1" (from), "2" (to) - :"$0","$1","$2","$3","$4","$5","$6","$7"); + unsigned long count = PAGE_SIZE/64; + unsigned long *to = (unsigned long *)_to; + unsigned long *from = (unsigned long *)_from; + + do { + unsigned long a,b,c,d,e,f,g,h; + a = from[0]; + b = from[1]; + c = from[2]; + d = from[3]; + e = from[4]; + f = from[5]; + g = from[6]; + h = from[7]; + count--; + from += 8; + to[0] = a; + to[1] = b; + to[2] = c; + to[3] = d; + to[4] = e; + to[5] = f; + to[6] = g; + to[7] = h; + to += 8; + } while (count); } #ifdef STRICT_MM_TYPECHECKS diff --git a/include/asm-alpha/pci.h b/include/asm-alpha/pci.h new file mode 100644 index 000000000..2dd28c3cc --- /dev/null +++ b/include/asm-alpha/pci.h @@ -0,0 +1,48 @@ +#ifndef __ALPHA_PCI_H +#define __ALPHA_PCI_H + +#include <linux/config.h> +#include <linux/pci.h> + + +/* + * The following structure is used to manage multiple PCI busses. + * + * XXX: We should solve thos problem in an architecture independant + * way, rather than hacking something up here. + */ + +struct linux_hose_info { + struct pci_bus pci_bus; + struct linux_hose_info *next; + unsigned long pci_io_space; + unsigned long pci_mem_space; + unsigned long pci_config_space; + unsigned long pci_sparse_space; + unsigned int pci_first_busno; + unsigned int pci_last_busno; + unsigned int pci_hose_index; +}; + +/* This is indexed by a pseudo- PCI bus number to obtain the real deal. */ +extern struct linux_hose_info *bus2hose[256]; + +/* Create a handle that is OR-ed into the reported I/O space address + for a device. We use this later to find the bus a device lives on. */ + +#if defined(CONFIG_ALPHA_GENERIC) \ + || defined(CONFIG_ALPHA_MCPCIA) \ + /* || defined(CONFIG_ALPHA_TSUNAMI) */ + +#define PCI_HANDLE(bus) ((bus2hose[bus]->pci_hose_index & 3UL) << 32) +#define DEV_IS_ON_PRIMARY(dev) \ + (bus2hose[(dev)->bus->number]->pci_first_busno == (dev)->bus->number) + +#else + +#define PCI_HANDLE(bus) 0 +#define DEV_IS_ON_PRIMARY(dev) ((dev)->bus->number == 0) + +#endif /* Multiple busses */ + +#endif /* __ALPHA_PCI_H */ diff --git a/include/asm-alpha/pgtable.h b/include/asm-alpha/pgtable.h index 3467e6103..3cbbaa17a 100644 --- a/include/asm-alpha/pgtable.h +++ b/include/asm-alpha/pgtable.h @@ -3,17 +3,20 @@ /* * This file contains the functions and defines necessary to modify and use - * the alpha page table tree. + * the Alpha page table tree. * - * This hopefully works with any standard alpha page-size, as defined + * This hopefully works with any standard Alpha page-size, as defined * in <asm/page.h> (currently 8192). */ #include <linux/config.h> #include <asm/system.h> +#include <asm/processor.h> /* For TASK_SIZE */ #include <asm/mmu_context.h> +#include <asm/machvec.h> -/* Caches aren't brain-dead on the alpha. */ + +/* Caches aren't brain-dead on the Alpha. */ #define flush_cache_all() do { } while (0) #define flush_cache_mm(mm) do { } while (0) #define flush_cache_range(mm, start, end) do { } while (0) @@ -22,60 +25,87 @@ #define flush_icache_range(start, end) do { } while (0) /* - * Force a context reload. This is needed when we - * change the page table pointer or when we update - * the ASN of the current process. - */ -static inline void reload_context(struct task_struct *task) -{ - __asm__ __volatile__( - "bis %0,%0,$16\n\t" -#ifdef CONFIG_ALPHA_DP264 - "zap $16,0xe0,$16\n\t" -#endif /* DP264 */ - "call_pal %1" - : /* no outputs */ - : "r" (&task->tss), "i" (PAL_swpctx) - : "$0", "$1", "$16", "$22", "$23", "$24", "$25"); -} - -/* * Use a few helper functions to hide the ugly broken ASN - * numbers on early alpha's (ev4 and ev45) + * numbers on early Alphas (ev4 and ev45) */ -#ifdef BROKEN_ASN -#define flush_tlb_current(x) tbiap() -#define flush_tlb_other(x) do { } while (0) +#ifndef __EXTERN_INLINE +#define __EXTERN_INLINE extern inline +#define __MMU_EXTERN_INLINE +#endif -#else +__EXTERN_INLINE void +ev4_flush_tlb_current(struct mm_struct *mm) +{ + tbiap(); +} -extern void get_new_asn_and_reload(struct task_struct *, struct mm_struct *); +__EXTERN_INLINE void +ev4_flush_tlb_other(struct mm_struct *mm) +{ +} -#define flush_tlb_current(mm) get_new_asn_and_reload(current, mm) -#define flush_tlb_other(mm) do { (mm)->context = 0; } while (0) +__EXTERN_INLINE void +ev5_flush_tlb_current(struct mm_struct *mm) +{ + mm->context = 0; + get_new_mmu_context(current, mm); + reload_context(current); +} -#endif +__EXTERN_INLINE void +ev5_flush_tlb_other(struct mm_struct *mm) +{ + mm->context = 0; +} /* * Flush just one page in the current TLB set. * We need to be very careful about the icache here, there * is no way to invalidate a specific icache page.. */ -static inline void flush_tlb_current_page(struct mm_struct * mm, - struct vm_area_struct *vma, - unsigned long addr) + +__EXTERN_INLINE void +ev4_flush_tlb_current_page(struct mm_struct * mm, + struct vm_area_struct *vma, + unsigned long addr) { -#ifdef BROKEN_ASN tbi(2 + ((vma->vm_flags & VM_EXEC) != 0), addr); -#else +} + +__EXTERN_INLINE void +ev5_flush_tlb_current_page(struct mm_struct * mm, + struct vm_area_struct *vma, + unsigned long addr) +{ if (vma->vm_flags & VM_EXEC) - flush_tlb_current(mm); + ev5_flush_tlb_current(mm); else tbi(2, addr); -#endif } + +#ifdef CONFIG_ALPHA_GENERIC +# define flush_tlb_current alpha_mv.mv_flush_tlb_current +# define flush_tlb_other alpha_mv.mv_flush_tlb_other +# define flush_tlb_current_page alpha_mv.mv_flush_tlb_current_page +#else +# ifdef CONFIG_ALPHA_EV4 +# define flush_tlb_current ev4_flush_tlb_current +# define flush_tlb_other ev4_flush_tlb_other +# define flush_tlb_current_page ev4_flush_tlb_current_page +# else +# define flush_tlb_current ev5_flush_tlb_current +# define flush_tlb_other ev5_flush_tlb_other +# define flush_tlb_current_page ev5_flush_tlb_current_page +# endif +#endif + +#ifdef __MMU_EXTERN_INLINE +#undef __EXTERN_INLINE +#undef __MMU_EXTERN_INLINE +#endif + /* * Flush current user mapping. */ @@ -125,8 +155,8 @@ static inline void flush_tlb_page(struct vm_area_struct *vma, } /* - * Flush a specified range of user mapping: on the - * alpha we flush the whole user tlb + * Flush a specified range of user mapping: on the + * Alpha we flush the whole user tlb. */ static inline void flush_tlb_range(struct mm_struct *mm, unsigned long start, unsigned long end) @@ -156,7 +186,7 @@ extern void flush_tlb_range(struct mm_struct *, unsigned long, unsigned long); #endif /* __SMP__ */ -/* Certain architectures need to do special things when pte's +/* Certain architectures need to do special things when PTEs * within a page table are directly modified. Thus, the following * hook is made available. */ @@ -173,20 +203,22 @@ extern void flush_tlb_range(struct mm_struct *, unsigned long, unsigned long); #define PGDIR_MASK (~(PGDIR_SIZE-1)) /* - * entries per page directory level: the alpha is three-level, with + * Entries per page directory level: the Alpha is three-level, with * all levels having a one-page page table. * - * The PGD is special: the last entry is reserved for self-mapping. + * The PGD is special: the last entry is reserved for self-mapping. */ #define PTRS_PER_PTE (1UL << (PAGE_SHIFT-3)) #define PTRS_PER_PMD (1UL << (PAGE_SHIFT-3)) #define PTRS_PER_PGD ((1UL << (PAGE_SHIFT-3))-1) +#define USER_PTRS_PER_PGD (TASK_SIZE / PGDIR_SIZE) -/* the no. of pointers that fit on a page: this will go away */ +/* Number of pointers that fit on a page: this will go away. */ #define PTRS_PER_PAGE (1UL << (PAGE_SHIFT-3)) #define VMALLOC_START 0xFFFFFE0000000000 #define VMALLOC_VMADDR(x) ((unsigned long)(x)) +#define VMALLOC_END (~0UL) /* * OSF/1 PAL-code-imposed page table bits @@ -206,7 +238,7 @@ extern void flush_tlb_range(struct mm_struct *, unsigned long, unsigned long); #define _PAGE_ACCESSED 0x40000 /* - * NOTE! The "accessed" bit isn't necessarily exact: it can be kept exactly + * NOTE! The "accessed" bit isn't necessarily exact: it can be kept exactly * by software (use the KRE/URE/KWE/UWE bits appropriately), but I'll fake it. * Under Linux/AXP, the "accessed" bit just means "read", and I'll just use * the KRE/URE bits to watch for it. That way we don't need to overload the @@ -240,7 +272,7 @@ extern void flush_tlb_range(struct mm_struct *, unsigned long, unsigned long); #define _PAGE_S(x) _PAGE_NORMAL(x) /* - * The hardware can handle write-only mappings, but as the alpha + * The hardware can handle write-only mappings, but as the Alpha * architecture does byte-wide writes with a read-modify-write * sequence, it's not practical to have write-without-read privs. * Thus the "-w- -> rw-" and "-wx -> rwx" mapping here (and in @@ -269,7 +301,7 @@ extern void flush_tlb_range(struct mm_struct *, unsigned long, unsigned long); * BAD_PAGETABLE is used when we need a bogus page-table, while * BAD_PAGE is used for a bogus page. * - * ZERO_PAGE is a global shared page that is always zero: used + * ZERO_PAGE is a global shared page that is always zero: used * for zero-mapped memory areas etc.. */ extern pte_t __bad_page(void); @@ -295,7 +327,7 @@ extern unsigned long __zero_page(void); ((unsigned long)(address)>>(PAGE_SHIFT-SIZEOF_PTR_LOG2)&PTR_MASK&~PAGE_MASK) /* - * Conversion functions: convert a page and protection to a page entry, + * Conversion functions: convert a page and protection to a page entry, * and a page entry and page directory to the page they refer to. */ extern inline pte_t mk_pte(unsigned long page, pgprot_t pgprot) @@ -401,132 +433,182 @@ extern inline pte_t * pte_offset(pmd_t * dir, unsigned long address) * used to allocate a kernel page table - this turns on ASN bits * if any. */ -extern inline void pte_free_kernel(pte_t * pte) +#ifndef __SMP__ +extern struct pgtable_cache_struct { + unsigned long *pgd_cache; + unsigned long *pte_cache; + unsigned long pgtable_cache_sz; +} quicklists; +#else +#include <asm/smp.h> +#define quicklists cpu_data[smp_processor_id()] +#endif +#define pgd_quicklist (quicklists.pgd_cache) +#define pmd_quicklist ((unsigned long *)0) +#define pte_quicklist (quicklists.pte_cache) +#define pgtable_cache_size (quicklists.pgtable_cache_sz) + +extern __inline__ pgd_t *get_pgd_slow(void) { - free_page((unsigned long) pte); + pgd_t *ret = (pgd_t *)__get_free_page(GFP_KERNEL), *init; + + if (ret) { + init = pgd_offset(&init_mm, 0); + memset (ret, 0, USER_PTRS_PER_PGD * sizeof(pgd_t)); + memcpy (ret + USER_PTRS_PER_PGD, init + USER_PTRS_PER_PGD, + (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t)); + } + return ret; } -extern inline pte_t * pte_alloc_kernel(pmd_t *pmd, unsigned long address) +extern __inline__ pgd_t *get_pgd_fast(void) { - address = (address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1); - if (pmd_none(*pmd)) { - pte_t *page = (pte_t *) get_free_page(GFP_KERNEL); - if (pmd_none(*pmd)) { - if (page) { - pmd_set(pmd, page); - return page + address; - } - pmd_set(pmd, (pte_t *) BAD_PAGETABLE); - return NULL; - } - free_page((unsigned long) page); - } - if (pmd_bad(*pmd)) { - printk("Bad pmd in pte_alloc: %08lx\n", pmd_val(*pmd)); - pmd_set(pmd, (pte_t *) BAD_PAGETABLE); - return NULL; - } - return (pte_t *) pmd_page(*pmd) + address; + unsigned long *ret; + + if((ret = pgd_quicklist) != NULL) { + pgd_quicklist = (unsigned long *)(*ret); + ret[0] = ret[1]; + pgtable_cache_size--; + } else + ret = (unsigned long *)get_pgd_slow(); + return (pgd_t *)ret; } -extern inline void pmd_free_kernel(pmd_t * pmd) +extern __inline__ void free_pgd_fast(pgd_t *pgd) { - free_page((unsigned long) pmd); + *(unsigned long *)pgd = (unsigned long) pgd_quicklist; + pgd_quicklist = (unsigned long *) pgd; + pgtable_cache_size++; } -extern inline pmd_t * pmd_alloc_kernel(pgd_t *pgd, unsigned long address) +extern __inline__ void free_pgd_slow(pgd_t *pgd) { - address = (address >> PMD_SHIFT) & (PTRS_PER_PMD - 1); - if (pgd_none(*pgd)) { - pmd_t *page = (pmd_t *) get_free_page(GFP_KERNEL); - if (pgd_none(*pgd)) { - if (page) { - pgd_set(pgd, page); - return page + address; - } - pgd_set(pgd, BAD_PAGETABLE); - return NULL; - } - free_page((unsigned long) page); + free_page((unsigned long)pgd); +} + +extern pmd_t *get_pmd_slow(pgd_t *pgd, unsigned long address_premasked); + +extern __inline__ pmd_t *get_pmd_fast(void) +{ + unsigned long *ret; + + if((ret = (unsigned long *)pte_quicklist) != NULL) { + pte_quicklist = (unsigned long *)(*ret); + ret[0] = ret[1]; + pgtable_cache_size--; } - if (pgd_bad(*pgd)) { - printk("Bad pgd in pmd_alloc: %08lx\n", pgd_val(*pgd)); - pgd_set(pgd, BAD_PAGETABLE); - return NULL; + return (pmd_t *)ret; +} + +extern __inline__ void free_pmd_fast(pmd_t *pmd) +{ + *(unsigned long *)pmd = (unsigned long) pte_quicklist; + pte_quicklist = (unsigned long *) pmd; + pgtable_cache_size++; +} + +extern __inline__ void free_pmd_slow(pmd_t *pmd) +{ + free_page((unsigned long)pmd); +} + +extern pte_t *get_pte_slow(pmd_t *pmd, unsigned long address_preadjusted); + +extern __inline__ pte_t *get_pte_fast(void) +{ + unsigned long *ret; + + if((ret = (unsigned long *)pte_quicklist) != NULL) { + pte_quicklist = (unsigned long *)(*ret); + ret[0] = ret[1]; + pgtable_cache_size--; } - return (pmd_t *) pgd_page(*pgd) + address; + return (pte_t *)ret; } -extern inline void pte_free(pte_t * pte) +extern __inline__ void free_pte_fast(pte_t *pte) { - free_page((unsigned long) pte); + *(unsigned long *)pte = (unsigned long) pte_quicklist; + pte_quicklist = (unsigned long *) pte; + pgtable_cache_size++; } +extern __inline__ void free_pte_slow(pte_t *pte) +{ + free_page((unsigned long)pte); +} + +extern void __bad_pte(pmd_t *pmd); +extern void __bad_pmd(pgd_t *pgd); + +#define pte_free_kernel(pte) free_pte_fast(pte) +#define pte_free(pte) free_pte_fast(pte) +#define pmd_free_kernel(pmd) free_pmd_fast(pmd) +#define pmd_free(pmd) free_pmd_fast(pmd) +#define pgd_free(pgd) free_pgd_fast(pgd) +#define pgd_alloc() get_pgd_fast() + extern inline pte_t * pte_alloc(pmd_t *pmd, unsigned long address) { address = (address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1); if (pmd_none(*pmd)) { - pte_t *page = (pte_t *) get_free_page(GFP_KERNEL); - if (pmd_none(*pmd)) { - if (page) { - pmd_set(pmd, page); - return page + address; - } - pmd_set(pmd, (pte_t *) BAD_PAGETABLE); - return NULL; - } - free_page((unsigned long) page); + pte_t *page = get_pte_fast(); + + if (!page) + return get_pte_slow(pmd, address); + pmd_set(pmd, page); + return page + address; } if (pmd_bad(*pmd)) { - printk("Bad pmd in pte_alloc: %08lx\n", pmd_val(*pmd)); - pmd_set(pmd, (pte_t *) BAD_PAGETABLE); + __bad_pte(pmd); return NULL; } return (pte_t *) pmd_page(*pmd) + address; } -extern inline void pmd_free(pmd_t * pmd) -{ - free_page((unsigned long) pmd); -} - extern inline pmd_t * pmd_alloc(pgd_t *pgd, unsigned long address) { address = (address >> PMD_SHIFT) & (PTRS_PER_PMD - 1); if (pgd_none(*pgd)) { - pmd_t *page = (pmd_t *) get_free_page(GFP_KERNEL); - if (pgd_none(*pgd)) { - if (page) { - pgd_set(pgd, page); - return page + address; - } - pgd_set(pgd, BAD_PAGETABLE); - return NULL; - } - free_page((unsigned long) page); + pmd_t *page = get_pmd_fast(); + + if (!page) + return get_pmd_slow(pgd, address); + pgd_set(pgd, page); + return page + address; } if (pgd_bad(*pgd)) { - printk("Bad pgd in pmd_alloc: %08lx\n", pgd_val(*pgd)); - pgd_set(pgd, BAD_PAGETABLE); + __bad_pmd(pgd); return NULL; } return (pmd_t *) pgd_page(*pgd) + address; } -extern inline void pgd_free(pgd_t * pgd) -{ - free_page((unsigned long) pgd); -} +#define pte_alloc_kernel pte_alloc +#define pmd_alloc_kernel pmd_alloc + +extern int do_check_pgt_cache(int, int); -extern inline pgd_t * pgd_alloc(void) +extern inline void set_pgdir(unsigned long address, pgd_t entry) { - return (pgd_t *) get_free_page(GFP_KERNEL); + struct task_struct * p; + pgd_t *pgd; + + read_lock(&tasklist_lock); + for_each_task(p) { + if (!p->mm) + continue; + *pgd_offset(p->mm,address) = entry; + } + read_unlock(&tasklist_lock); + for (pgd = (pgd_t *)pgd_quicklist; pgd; pgd = (pgd_t *)*(unsigned long *)pgd) + pgd[(address >> PGDIR_SHIFT) & (PTRS_PER_PAGE - 1)] = entry; } extern pgd_t swapper_pg_dir[1024]; /* - * The alpha doesn't have any external MMU info: the kernel page + * The Alpha doesn't have any external MMU info: the kernel page * tables contain all the necessary information. */ extern inline void update_mmu_cache(struct vm_area_struct * vma, @@ -535,8 +617,8 @@ extern inline void update_mmu_cache(struct vm_area_struct * vma, } /* - * Non-present pages: high 24 bits are offset, next 8 bits type, - * low 32 bits zero.. + * Non-present pages: high 24 bits are offset, next 8 bits type, + * low 32 bits zero. */ extern inline pte_t mk_swap_pte(unsigned long type, unsigned long offset) { pte_t pte; pte_val(pte) = (type << 32) | (offset << 40); return pte; } @@ -548,4 +630,7 @@ extern inline pte_t mk_swap_pte(unsigned long type, unsigned long offset) #define module_map vmalloc #define module_unmap vfree +/* Needs to be defined here and not in linux/mm.h, as it is arch dependent */ +#define PageSkip(page) (0) + #endif /* _ALPHA_PGTABLE_H */ diff --git a/include/asm-alpha/posix_types.h b/include/asm-alpha/posix_types.h index b98290660..3cbf6d573 100644 --- a/include/asm-alpha/posix_types.h +++ b/include/asm-alpha/posix_types.h @@ -34,6 +34,8 @@ typedef struct { int val[2]; } __kernel_fsid_t; +#ifdef __KERNEL__ + #ifndef __GNUC__ #define __FD_SET(d, set) ((set)->fds_bits[__FDELT(d)] |= __FDMASK(d)) @@ -109,4 +111,6 @@ static __inline__ void __FD_ZERO(__kernel_fd_set *p) #endif /* __GNUC__ */ +#endif /* __KERNEL__ */ + #endif /* _ALPHA_POSIX_TYPES_H */ diff --git a/include/asm-alpha/processor.h b/include/asm-alpha/processor.h index c36876ca8..ee6613b6a 100644 --- a/include/asm-alpha/processor.h +++ b/include/asm-alpha/processor.h @@ -45,14 +45,21 @@ struct thread_struct { unsigned long pal_flags; unsigned long res1, res2; - /* the fields below are Linux-specific: */ - /* bit 1..5: IEEE_TRAP_ENABLE bits (see fpu.h) */ - /* bit 6..8: UAC bits (see sysinfo.h) */ - /* bit 17..21: IEEE_STATUS_MASK bits (see fpu.h) */ - /* bit 63: die_if_kernel recursion lock */ + /* + * The fields below are Linux-specific: + * + * bit 1..5: IEEE_TRAP_ENABLE bits (see fpu.h) + * bit 6..8: UAC bits (see sysinfo.h) + * bit 17..21: IEEE_STATUS_MASK bits (see fpu.h) + * bit 63: die_if_kernel recursion lock + */ unsigned long flags; - /* perform syscall argument validation (get/set_fs) */ + + /* Perform syscall argument validation (get/set_fs). */ mm_segment_t fs; + + /* Breakpoint handling for ptrace. */ + long debugreg[8]; }; #define INIT_MMAP { &init_mm, 0xfffffc0000000000, 0xfffffc0010000000, \ @@ -75,13 +82,23 @@ struct thread_struct { * holds provided the thread blocked through a call to schedule() ($15 * is the frame pointer in schedule() and $15 is saved at offset 48 by * entry.S:do_switch_stack). + * + * Under heavy swap load I've seen this loose in an ugly way. So do + * some extra sanity checking on the ranges we expect these pointers + * to be in so that we can fail gracefully. This is just for ps after + * all. -- r~ */ extern inline unsigned long thread_saved_pc(struct thread_struct *t) { - unsigned long fp; - - fp = ((unsigned long*)t->ksp)[6]; - return *(unsigned long*)fp; + unsigned long fp, sp = t->ksp, base = (unsigned long)t; + + if (sp > base && sp+6*8 < base + 16*1024) { + fp = ((unsigned long*)sp)[6]; + if (fp > sp && fp < base + 16*1024) + return *(unsigned long *)fp; + } + + return 0; } /* diff --git a/include/asm-alpha/serial.h b/include/asm-alpha/serial.h index 565b59dd0..7b2d9ee95 100644 --- a/include/asm-alpha/serial.h +++ b/include/asm-alpha/serial.h @@ -37,7 +37,7 @@ #ifdef CONFIG_SERIAL_MANY_PORTS -#define EXTRA_SERIAL_PORT_DEFNS \ +#define EXTRA_SERIAL_PORT_DEFNS \ { 0, BASE_BAUD, 0x1A0, 9, FOURPORT_FLAGS }, /* ttyS4 */ \ { 0, BASE_BAUD, 0x1A8, 9, FOURPORT_FLAGS }, /* ttyS5 */ \ { 0, BASE_BAUD, 0x1B0, 9, FOURPORT_FLAGS }, /* ttyS6 */ \ diff --git a/include/asm-alpha/siginfo.h b/include/asm-alpha/siginfo.h index b32ceb1f9..c2304b041 100644 --- a/include/asm-alpha/siginfo.h +++ b/include/asm-alpha/siginfo.h @@ -43,6 +43,7 @@ typedef struct siginfo { /* SIGCHLD */ struct { pid_t _pid; /* which child */ + uid_t _uid; /* sender's uid */ int _status; /* exit code */ clock_t _utime; clock_t _stime; diff --git a/include/asm-alpha/signal.h b/include/asm-alpha/signal.h index 80e27df1a..501f35ea5 100644 --- a/include/asm-alpha/signal.h +++ b/include/asm-alpha/signal.h @@ -76,7 +76,7 @@ typedef unsigned long sigset_t; /* * SA_FLAGS values: * - * SA_ONSTACK is not currently supported, but will allow sigaltstack(2). + * SA_ONSTACK indicates that a registered stack_t will be used. * SA_INTERRUPT is a no-op, but left due to historical reasons. Use the * SA_RESTART flag to get restarting signals (which were the default long ago) * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. @@ -100,6 +100,16 @@ typedef unsigned long sigset_t; #define SA_NOMASK SA_NODEFER #define SA_INTERRUPT 0x20000000 /* dummy -- ignored */ +/* + * sigaltstack controls + */ +#define SS_ONSTACK 1 +#define SS_DISABLE 2 + +#define MINSIGSTKSZ 4096 +#define SIGSTKSZ 16384 + + #ifdef __KERNEL__ /* * These values of sa_flags are used only by the kernel as part of the @@ -164,6 +174,15 @@ typedef struct sigaltstack { size_t ss_size; } stack_t; +/* sigstack(2) is deprecated, and will be withdrawn in a future version + of the X/Open CAE Specification. Use sigaltstack instead. It is only + implemented here for OSF/1 compatibility. */ + +struct sigstack { + void *ss_sp; + int ss_onstack; +}; + #ifdef __KERNEL__ #include <asm/sigcontext.h> #endif diff --git a/include/asm-alpha/smp.h b/include/asm-alpha/smp.h index 811abc297..90bfec2e2 100644 --- a/include/asm-alpha/smp.h +++ b/include/asm-alpha/smp.h @@ -1,8 +1,6 @@ #ifndef __ASM_SMP_H #define __ASM_SMP_H -#define cpu_logical_map(cpu) (cpu) - #ifdef __SMP__ #include <linux/tasks.h> @@ -10,6 +8,9 @@ struct cpuinfo_alpha { unsigned long loops_per_sec; unsigned int next; + unsigned long *pgd_cache; + unsigned long *pte_cache; + unsigned long pgtable_cache_sz; }; extern struct cpuinfo_alpha cpu_data[NR_CPUS]; @@ -44,7 +45,8 @@ extern __volatile__ int cpu_number_map[NR_CPUS]; __r0; \ }) -#define smp_processor_id() hard_smp_processor_id() +#define smp_processor_id() hard_smp_processor_id() +#define cpu_logical_map(cpu) (cpu) #endif /* __SMP__ */ diff --git a/include/asm-alpha/smp_lock.h b/include/asm-alpha/smp_lock.h deleted file mode 100644 index bd04c6fb2..000000000 --- a/include/asm-alpha/smp_lock.h +++ /dev/null @@ -1,120 +0,0 @@ -#ifndef __ALPHA_SMPLOCK_H -#define __ALPHA_SMPLOCK_H - -#ifndef __SMP__ - -#define lock_kernel() do { } while(0) -#define unlock_kernel() do { } while(0) -#define release_kernel_lock(task, cpu, depth) ((depth) = 1) -#define reacquire_kernel_lock(task, cpu, depth) do { } while (0) - -#else - -#include <asm/system.h> -#include <asm/current.h> -#include <asm/bitops.h> -#include <asm/hardirq.h> - -#define kernel_lock_held() \ - (klock_info.kernel_flag && (klock_info.akp == smp_processor_id())) - -/* Release global kernel lock and global interrupt lock */ -#define release_kernel_lock(task, cpu, depth) \ -do { \ - if ((depth = (task)->lock_depth) != 0) { \ - __cli(); \ - (task)->lock_depth = 0; \ - klock_info.akp = NO_PROC_ID; \ - klock_info.kernel_flag = 0; \ - mb(); \ - } \ - release_irqlock(cpu); \ - __sti(); \ -} while (0) - -#if 1 -#define DEBUG_KERNEL_LOCK -#else -#undef DEBUG_KERNEL_LOCK -#endif - -#ifdef DEBUG_KERNEL_LOCK -extern void ___lock_kernel(klock_info_t *klip, int cpu, long ipl); -#else /* DEBUG_KERNEL_LOCK */ -static inline void ___lock_kernel(klock_info_t *klip, int cpu, long ipl) -{ - long regx; - - __asm__ __volatile__( - "1: ldl_l %1,%0;" - " blbs %1,6f;" - " or %1,1,%1;" - " stl_c %1,%0;" - " beq %1,6f;" - "4: mb\n" - ".section .text2,\"ax\"\n" - "6: mov %4,$16;" - " call_pal %3;" - "7: ldl %1,%0;" - " blbs %1,7b;" - " bis $31,7,$16;" - " call_pal %3;" - " br 1b\n" - ".previous" - : "=m,=m" (__dummy_lock(klip)), "=&r,=&r" (regx) - : "0,0" (__dummy_lock(klip)), "i,i" (PAL_swpipl), "i,r" (ipl) - : "$0", "$1", "$16", "$22", "$23", "$24", "$25", "memory" - ); -} -#endif /* DEBUG_KERNEL_LOCK */ - -#define reacquire_kernel_lock(task, cpu, depth) \ -do { \ - if (depth) { \ - long ipl; \ - klock_info_t *klip = &klock_info; \ - __save_and_cli(ipl); \ - ___lock_kernel(klip, cpu, ipl); \ - klip->akp = cpu; \ - (task)->lock_depth = depth; \ - __restore_flags(ipl); \ - } \ -} while (0) - -/* The following acquire and release the master kernel global lock, - * the idea is that the usage of this mechanmism becomes less and less - * as time goes on, to the point where they are no longer needed at all - * and can thus disappear. - */ - -#define lock_kernel() \ -if (current->lock_depth > 0) { \ - ++current->lock_depth; \ -} else { \ - long ipl; \ - int cpu = smp_processor_id(); \ - klock_info_t *klip = &klock_info; \ - __save_and_cli(ipl); \ - ___lock_kernel(klip, cpu, ipl); \ - klip->akp = cpu; \ - current->lock_depth = 1; \ - __restore_flags(ipl); \ -} - -/* Release kernel global lock. */ -#define unlock_kernel() \ -if (current->lock_depth > 1) { \ - --current->lock_depth; \ -} else { \ - long ipl; \ - __save_and_cli(ipl); \ - klock_info.akp = NO_PROC_ID; \ - klock_info.kernel_flag = KLOCK_CLEAR; \ - mb(); \ - current->lock_depth = 0; \ - __restore_flags(ipl); \ -} - -#endif /* __SMP__ */ - -#endif /* __ALPHA_SMPLOCK_H */ diff --git a/include/asm-alpha/smplock.h b/include/asm-alpha/smplock.h new file mode 100644 index 000000000..e62326a10 --- /dev/null +++ b/include/asm-alpha/smplock.h @@ -0,0 +1,49 @@ +/* + * <asm/smplock.h> + * + * Default SMP lock implementation + */ +#include <linux/interrupt.h> +#include <asm/spinlock.h> + +extern spinlock_t kernel_flag; + +/* + * Release global kernel lock and global interrupt lock + */ +#define release_kernel_lock(task, cpu) \ +do { \ + if (task->lock_depth >= 0) \ + spin_unlock(&kernel_flag); \ + release_irqlock(cpu); \ + __sti(); \ +} while (0) + +/* + * Re-acquire the kernel lock + */ +#define reacquire_kernel_lock(task) \ +do { \ + if (task->lock_depth >= 0) \ + spin_lock(&kernel_flag); \ +} while (0) + + +/* + * Getting the big kernel lock. + * + * This cannot happen asynchronously, + * so we only need to worry about other + * CPU's. + */ +extern __inline__ void lock_kernel(void) +{ + if (!++current->lock_depth) + spin_lock(&kernel_flag); +} + +extern __inline__ void unlock_kernel(void) +{ + if (--current->lock_depth < 0) + spin_unlock(&kernel_flag); +} diff --git a/include/asm-alpha/string.h b/include/asm-alpha/string.h index 4b83c8291..11495a0b6 100644 --- a/include/asm-alpha/string.h +++ b/include/asm-alpha/string.h @@ -4,10 +4,8 @@ #ifdef __KERNEL__ /* - * GCC of any recent vintage doesn't do stupid things with bcopy. Of - * EGCS-devel vintage, it knows all about expanding memcpy inline. - * For things other than EGCS-devel but still recent, GCC will expand - * __builtin_memcpy as a simple call to memcpy. + * GCC of any recent vintage doesn't do stupid things with bcopy. + * EGCS 1.1 knows all about expanding memcpy inline, others don't. * * Similarly for a memset with data = 0. */ @@ -16,15 +14,15 @@ /* For backward compatibility with modules. Unused otherwise. */ extern void * __memcpy(void *, const void *, size_t); -#if __GNUC__ > 2 || __GNUC_MINOR__ >= 8 +#if __GNUC__ > 2 || __GNUC_MINOR__ >= 91 #define memcpy __builtin_memcpy #endif #define __HAVE_ARCH_MEMSET -extern void * __constant_c_memset(void *, unsigned long, long); -extern void * __memset(void *, char, size_t); +extern void * __constant_c_memset(void *, unsigned long, size_t); +extern void * __memset(void *, int, size_t); -#if __GNUC__ > 2 || __GNUC_MINOR__ >= 8 +#if __GNUC__ > 2 || __GNUC_MINOR__ >= 91 #define memset(s, c, n) \ (__builtin_constant_p(c) \ ? (__builtin_constant_p(n) && (c) == 0 \ @@ -46,6 +44,20 @@ extern void * __memset(void *, char, size_t); #define __HAVE_ARCH_STRRCHR #define __HAVE_ARCH_STRLEN +/* The following routine is like memset except that it writes 16-bit + aligned values. The DEST and COUNT parameters must be even for + correct operation. */ + +#define __HAVE_ARCH_MEMSETW +extern void * __memsetw(void *dest, unsigned short, size_t count); + +#define memsetw(s, c, n) \ +(__builtin_constant_p(c) \ + ? __constant_c_memset((s),0x0001000100010001UL*(unsigned short)(c),(n)) \ + : __memsetw((s),(c),(n))) + +extern int strcasecmp(const char *, const char *); + #endif /* __KERNEL__ */ #endif /* __ALPHA_STRING_H__ */ diff --git a/include/asm-alpha/system.h b/include/asm-alpha/system.h index 72b91317e..a4f18c347 100644 --- a/include/asm-alpha/system.h +++ b/include/asm-alpha/system.h @@ -100,7 +100,7 @@ extern void wripir(unsigned long); #define switch_to(prev,next) do { \ current = next; \ - alpha_switch_to((unsigned long) ¤t->tss - 0xfffffc0000000000); \ + alpha_switch_to((unsigned long) ¤t->tss - IDENT_ADDR); \ } while (0) extern void alpha_switch_to(unsigned long pctxp); @@ -108,6 +108,9 @@ extern void alpha_switch_to(unsigned long pctxp); #define mb() \ __asm__ __volatile__("mb": : :"memory") +#define wmb() \ +__asm__ __volatile__("wmb": : :"memory") + #define imb() \ __asm__ __volatile__ ("call_pal %0" : : "i" (PAL_imb) : "memory") diff --git a/include/asm-alpha/timex.h b/include/asm-alpha/timex.h new file mode 100644 index 000000000..c0bfb799c --- /dev/null +++ b/include/asm-alpha/timex.h @@ -0,0 +1,11 @@ +/* + * linux/include/asm-alpha/timex.h + * + * ALPHA architecture timex specifications + */ +#ifndef _ASMALPHA_TIMEX_H +#define _ASMALPHA_TIMEX_H + +#define CLOCK_TICK_RATE 1193180 /* Underlying HZ */ + +#endif diff --git a/include/asm-alpha/uaccess.h b/include/asm-alpha/uaccess.h index 5ab23c062..665acc313 100644 --- a/include/asm-alpha/uaccess.h +++ b/include/asm-alpha/uaccess.h @@ -161,7 +161,7 @@ struct __large_struct { unsigned long buf[100]; }; : "m"(__m(addr)), "1"(__gu_err)) #ifdef __HAVE_CPU_BWX -/* Those lucky bastards with ev56 and later cpus can do byte/word moves. */ +/* Those lucky bastards with ev56 and later CPUs can do byte/word moves. */ #define __get_user_16(addr) \ __asm__("1: ldwu %0,%2\n" \ @@ -275,7 +275,7 @@ __asm__ __volatile__("1: stl %r2,%1\n" \ : "m"(__m(addr)), "rJ"(x), "0"(__pu_err)) #ifdef __HAVE_CPU_BWX -/* Those lucky bastards with ev56 and later cpus can do byte/word moves. */ +/* Those lucky bastards with ev56 and later CPUs can do byte/word moves. */ #define __put_user_16(x,addr) \ __asm__ __volatile__("1: stw %r2,%1\n" \ diff --git a/include/asm-alpha/unaligned.h b/include/asm-alpha/unaligned.h index 35da3d5ae..8017f6bfa 100644 --- a/include/asm-alpha/unaligned.h +++ b/include/asm-alpha/unaligned.h @@ -17,11 +17,24 @@ extern void bad_unaligned_access_length(void); /* + * EGCS 1.1 knows about arbitrary unaligned loads. Define some + * packed structures to talk about such things with. + */ + +struct __una_u64 { __u64 x __attribute__((packed)); }; +struct __una_u32 { __u32 x __attribute__((packed)); }; +struct __una_u16 { __u16 x __attribute__((packed)); }; + +/* * Elemental unaligned loads */ extern inline unsigned long __uldq(const unsigned long * r11) { +#if __GNUC__ > 2 || __GNUC_MINOR__ >= 91 + const struct __una_u64 *ptr = (const struct __una_u64 *) r11; + return ptr->x; +#else unsigned long r1,r2; __asm__("ldq_u %0,%3\n\t" "ldq_u %1,%4\n\t" @@ -32,10 +45,15 @@ extern inline unsigned long __uldq(const unsigned long * r11) "m" (*r11), "m" (*(const unsigned long *)(7+(char *) r11))); return r1 | r2; +#endif } extern inline unsigned long __uldl(const unsigned int * r11) { +#if __GNUC__ > 2 || __GNUC_MINOR__ >= 91 + const struct __una_u32 *ptr = (const struct __una_u32 *) r11; + return ptr->x; +#else unsigned long r1,r2; __asm__("ldq_u %0,%3\n\t" "ldq_u %1,%4\n\t" @@ -46,10 +64,15 @@ extern inline unsigned long __uldl(const unsigned int * r11) "m" (*r11), "m" (*(const unsigned long *)(3+(char *) r11))); return r1 | r2; +#endif } extern inline unsigned long __uldw(const unsigned short * r11) { +#if __GNUC__ > 2 || __GNUC_MINOR__ >= 91 + const struct __una_u16 *ptr = (const struct __una_u16 *) r11; + return ptr->x; +#else unsigned long r1,r2; __asm__("ldq_u %0,%3\n\t" "ldq_u %1,%4\n\t" @@ -60,6 +83,7 @@ extern inline unsigned long __uldw(const unsigned short * r11) "m" (*r11), "m" (*(const unsigned long *)(1+(char *) r11))); return r1 | r2; +#endif } /* @@ -68,6 +92,10 @@ extern inline unsigned long __uldw(const unsigned short * r11) extern inline void __ustq(unsigned long r5, unsigned long * r11) { +#if __GNUC__ > 2 || __GNUC_MINOR__ >= 91 + struct __una_u64 *ptr = (struct __una_u64 *) r11; + ptr->x = r5; +#else unsigned long r1,r2,r3,r4; __asm__("ldq_u %3,%1\n\t" @@ -84,10 +112,15 @@ extern inline void __ustq(unsigned long r5, unsigned long * r11) "=m" (*(unsigned long *)(7+(char *) r11)), "=&r" (r1), "=&r" (r2), "=&r" (r3), "=&r" (r4) :"r" (r5), "r" (r11)); +#endif } extern inline void __ustl(unsigned long r5, unsigned int * r11) { +#if __GNUC__ > 2 || __GNUC_MINOR__ >= 91 + struct __una_u32 *ptr = (struct __una_u32 *) r11; + ptr->x = r5; +#else unsigned long r1,r2,r3,r4; __asm__("ldq_u %3,%1\n\t" @@ -104,10 +137,15 @@ extern inline void __ustl(unsigned long r5, unsigned int * r11) "=m" (*(unsigned long *)(3+(char *) r11)), "=&r" (r1), "=&r" (r2), "=&r" (r3), "=&r" (r4) :"r" (r5), "r" (r11)); +#endif } extern inline void __ustw(unsigned long r5, unsigned short * r11) { +#if __GNUC__ > 2 || __GNUC_MINOR__ >= 91 + struct __una_u16 *ptr = (struct __una_u16 *) r11; + ptr->x = r5; +#else unsigned long r1,r2,r3,r4; __asm__("ldq_u %3,%1\n\t" @@ -124,6 +162,7 @@ extern inline void __ustw(unsigned long r5, unsigned short * r11) "=m" (*(unsigned long *)(1+(char *) r11)), "=&r" (r1), "=&r" (r2), "=&r" (r3), "=&r" (r4) :"r" (r5), "r" (r11)); +#endif } extern inline unsigned long __get_unaligned(const void *ptr, size_t size) diff --git a/include/asm-alpha/unistd.h b/include/asm-alpha/unistd.h index e5c3636f7..6fcf82aff 100644 --- a/include/asm-alpha/unistd.h +++ b/include/asm-alpha/unistd.h @@ -113,7 +113,7 @@ #define __NR_osf_old_sigblock 109 /* not implemented */ #define __NR_osf_old_sigsetmask 110 /* not implemented */ #define __NR_sigsuspend 111 -#define __NR_osf_sigstack 112 /* not implemented */ +#define __NR_osf_sigstack 112 #define __NR_recvmsg 113 #define __NR_sendmsg 114 #define __NR_osf_old_vtrace 115 /* not implemented */ @@ -205,7 +205,7 @@ #define __NR_getpgid 233 #define __NR_getsid 234 -#define __NR_osf_sigaltstack 235 /* not implemented */ +#define __NR_sigaltstack 235 #define __NR_osf_waitid 236 /* not implemented */ #define __NR_osf_priocntlset 237 /* not implemented */ #define __NR_osf_sigsendset 238 /* not implemented */ @@ -304,52 +304,188 @@ #define __NR_getrusage 364 #define __NR_wait4 365 #define __NR_adjtimex 366 - +#define __NR_getcwd 367 +#define __NR_capget 368 +#define __NR_capset 369 #if defined(__LIBRARY__) && defined(__GNUC__) -/* XXX - _foo needs to be __foo, while __NR_bar could be _NR_bar. */ +#define _syscall_return(type) \ + return (_sc_err ? errno = _sc_ret, _sc_ret = -1L : 0), (type) _sc_ret + +#define _syscall_clobbers \ + "$1", "$2", "$3", "$4", "$5", "$6", "$7", "$8", \ + "$22", "$23", "$24", "$25", "$27", "$28" \ + #define _syscall0(type, name) \ type name(void) \ { \ - extern long syscall (int, ...); \ - return syscall(__NR_##name)); \ + long _sc_ret, _sc_err; \ + { \ + register long _sc_0 __asm__("$0"); \ + register long _sc_19 __asm__("$19"); \ + \ + _sc_0 = __NR_##name; \ + __asm__("callsys # %0 %1 %2" \ + : "=r"(_sc_0), "=r"(_sc_19) \ + : "0"(_sc_0) \ + : _syscall_clobbers); \ + _sc_ret = _sc_0, _sc_err = _sc_19; \ + } \ + _syscall_return(type); \ } #define _syscall1(type,name,type1,arg1) \ type name(type1 arg1) \ { \ - extern long syscall (int, ...); \ - return syscall(__NR_##name, arg1); \ + long _sc_ret, _sc_err; \ + { \ + register long _sc_0 __asm__("$0"); \ + register long _sc_16 __asm__("$16"); \ + register long _sc_19 __asm__("$19"); \ + \ + _sc_0 = __NR_##name; \ + _sc_16 = (long) (arg1); \ + __asm__("callsys # %0 %1 %2 %3" \ + : "=r"(_sc_0), "=r"(_sc_19) \ + : "0"(_sc_0), "r"(_sc_16) \ + : _syscall_clobbers); \ + _sc_ret = _sc_0, _sc_err = _sc_19; \ + } \ + _syscall_return(type); \ } #define _syscall2(type,name,type1,arg1,type2,arg2) \ type name(type1 arg1,type2 arg2) \ { \ - extern long syscall (int, ...); \ - return syscall(__NR_##name, arg1, arg2); \ + long _sc_ret, _sc_err; \ + { \ + register long _sc_0 __asm__("$0"); \ + register long _sc_16 __asm__("$16"); \ + register long _sc_17 __asm__("$17"); \ + register long _sc_19 __asm__("$19"); \ + \ + _sc_0 = __NR_##name; \ + _sc_16 = (long) (arg1); \ + _sc_17 = (long) (arg2); \ + __asm__("callsys # %0 %1 %2 %3 %4" \ + : "=r"(_sc_0), "=r"(_sc_19) \ + : "0"(_sc_0), "r"(_sc_16), "r"(_sc_17) \ + : _syscall_clobbers); \ + _sc_ret = _sc_0, _sc_err = _sc_19; \ + } \ + _syscall_return(type); \ } #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \ type name(type1 arg1,type2 arg2,type3 arg3) \ { \ - extern long syscall (int, ...); \ - return syscall(__NR_##name, arg1, arg2, arg3); \ + long _sc_ret, _sc_err; \ + { \ + register long _sc_0 __asm__("$0"); \ + register long _sc_16 __asm__("$16"); \ + register long _sc_17 __asm__("$17"); \ + register long _sc_18 __asm__("$18"); \ + register long _sc_19 __asm__("$19"); \ + \ + _sc_0 = __NR_##name; \ + _sc_16 = (long) (arg1); \ + _sc_17 = (long) (arg2); \ + _sc_18 = (long) (arg3); \ + __asm__("callsys # %0 %1 %2 %3 %4 %5" \ + : "=r"(_sc_0), "=r"(_sc_19) \ + : "0"(_sc_0), "r"(_sc_16), "r"(_sc_17), \ + "r"(_sc_18) \ + : _syscall_clobbers); \ + _sc_ret = _sc_0, _sc_err = _sc_19; \ + } \ + _syscall_return(type); \ } #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \ type name (type1 arg1, type2 arg2, type3 arg3, type4 arg4) \ { \ - extern long syscall (int, ...); \ - return syscall(__NR_##name, arg1, arg2, arg3, arg4); \ + long _sc_ret, _sc_err; \ + { \ + register long _sc_0 __asm__("$0"); \ + register long _sc_16 __asm__("$16"); \ + register long _sc_17 __asm__("$17"); \ + register long _sc_18 __asm__("$18"); \ + register long _sc_19 __asm__("$19"); \ + \ + _sc_0 = __NR_##name; \ + _sc_16 = (long) (arg1); \ + _sc_17 = (long) (arg2); \ + _sc_18 = (long) (arg3); \ + _sc_19 = (long) (arg4); \ + __asm__("callsys # %0 %1 %2 %3 %4 %5 %6" \ + : "=r"(_sc_0), "=r"(_sc_19) \ + : "0"(_sc_0), "r"(_sc_16), "r"(_sc_17), \ + "r"(_sc_18), "1"(_sc_19) \ + : _syscall_clobbers); \ + _sc_ret = _sc_0, _sc_err = _sc_19; \ + } \ + _syscall_return(type); \ } #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ type5,arg5) \ -type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5) \ -{ \ - extern long syscall (int, ...); \ - return syscall(__NR_##name, arg1, arg2, arg3, arg4, arg5); \ +type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5) \ +{ \ + long _sc_ret, _sc_err; \ + { \ + register long _sc_0 __asm__("$0"); \ + register long _sc_16 __asm__("$16"); \ + register long _sc_17 __asm__("$17"); \ + register long _sc_18 __asm__("$18"); \ + register long _sc_19 __asm__("$19"); \ + register long _sc_20 __asm__("$20"); \ + \ + _sc_0 = __NR_##name; \ + _sc_16 = (long) (arg1); \ + _sc_17 = (long) (arg2); \ + _sc_18 = (long) (arg3); \ + _sc_19 = (long) (arg4); \ + _sc_20 = (long) (arg5); \ + __asm__("callsys # %0 %1 %2 %3 %4 %5 %6 %7" \ + : "=r"(_sc_0), "=r"(_sc_19) \ + : "0"(_sc_0), "r"(_sc_16), "r"(_sc_17), \ + "r"(_sc_18), "1"(_sc_19), "r"(_sc_20) \ + : _syscall_clobbers); \ + _sc_ret = _sc_0, _sc_err = _sc_19; \ + } \ + _syscall_return(type); \ +} + +#define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5,type6,arg6) \ +type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5, type6 arg6)\ +{ \ + long _sc_ret, _sc_err; \ + { \ + register long _sc_0 __asm__("$0"); \ + register long _sc_16 __asm__("$16"); \ + register long _sc_17 __asm__("$17"); \ + register long _sc_18 __asm__("$18"); \ + register long _sc_19 __asm__("$19"); \ + register long _sc_20 __asm__("$20"); \ + register long _sc_21 __asm__("$21"); \ + \ + _sc_0 = __NR_##name; \ + _sc_16 = (long) (arg1); \ + _sc_17 = (long) (arg2); \ + _sc_18 = (long) (arg3); \ + _sc_19 = (long) (arg4); \ + _sc_20 = (long) (arg5); \ + _sc_21 = (long) (arg6); \ + __asm__("callsys # %0 %1 %2 %3 %4 %5 %6 %7 %8" \ + : "=r"(_sc_0), "=r"(_sc_19) \ + : "0"(_sc_0), "r"(_sc_16), "r"(_sc_17), \ + "r"(_sc_18), "1"(_sc_19), "r"(_sc_20), "r"(_sc_21) \ + : _syscall_clobbers); \ + _sc_ret = _sc_0, _sc_err = _sc_19; \ + } \ + _syscall_return(type); \ } #endif /* __LIBRARY__ && __GNUC__ */ diff --git a/include/asm-alpha/vga.h b/include/asm-alpha/vga.h new file mode 100644 index 000000000..733fe41c7 --- /dev/null +++ b/include/asm-alpha/vga.h @@ -0,0 +1,56 @@ +/* + * Access to VGA videoram + * + * (c) 1998 Martin Mares <mj@ucw.cz> + */ + +#ifndef _LINUX_ASM_VGA_H_ +#define _LINUX_ASM_VGA_H_ + +#include <asm/io.h> + +#define VT_BUF_HAVE_RW +#define VT_BUF_HAVE_MEMSETW +#define VT_BUF_HAVE_MEMCPYF + +extern inline void scr_writew(u16 val, u16 *addr) +{ + if ((long) addr < 0) + *addr = val; + else + writew(val, (unsigned long) addr); +} + +extern inline u16 scr_readw(u16 *addr) +{ + if ((long) addr < 0) + return *addr; + else + return readw((unsigned long) addr); +} + +extern inline void scr_memsetw(u16 *s, u16 c, unsigned int count) +{ + if ((long)s < 0) + memsetw(s, c, count); + else + memsetw_io(s, c, count); +} + +extern inline void scr_memcpyw_from(u16 *d, u16 *s, unsigned int count) +{ + memcpy_fromio(d, s, count); +} + +extern inline void scr_memcpyw_to(u16 *d, u16 *s, unsigned int count) +{ + memcpy_toio(d, s, count); +} + + +#define vga_readb readb +#define vga_writeb writeb + +#define VGA_MAP_MEM(x) (x) + +#endif diff --git a/include/asm-arm/arch-arc/ide.h b/include/asm-arm/arch-arc/ide.h index 8cc1baaa4..24bc4899d 100644 --- a/include/asm-arm/arch-arc/ide.h +++ b/include/asm-arm/arch-arc/ide.h @@ -11,13 +11,14 @@ */ #include <linux/config.h> +#include <asm/irq.h> static __inline__ int ide_default_irq(ide_ioreg_t base) { #ifdef CONFIG_ARCH_A5K if (base == 0x1f0) - return 11; + return IRQ_HARDDISK; #endif return 0; } @@ -52,5 +53,5 @@ ide_init_hwif_ports (ide_ioreg_t *p, ide_ioreg_t base, int stepping, int *irq) } *p++ = ctrl; if (irq != NULL) - irq = 0; + *irq = 0; } diff --git a/include/asm-arm/arch-arc/io.h b/include/asm-arm/arch-arc/io.h index 1639e6d46..0b77060c5 100644 --- a/include/asm-arm/arch-arc/io.h +++ b/include/asm-arm/arch-arc/io.h @@ -159,7 +159,18 @@ DECLARE_IO(long,l,"") result & 0xffff; \ }) -#define __outlc(v,p) __outwc((v),(p)) +#define __outlc(value,port) \ +({ \ + unsigned long v = value; \ + if (__PORT_PCIO((port))) \ + __asm__ __volatile__( \ + "str %0, [%1, %2]" \ + : : "r" (v), "r" (PCIO_BASE), "Jr" ((port) << 2)); \ + else \ + __asm__ __volatile__( \ + "str %0, [%1, %2]" \ + : : "r" (v), "r" (IO_BASE), "r" ((port) << 2)); \ +}) #define __inlc(port) \ ({ \ diff --git a/include/asm-arm/arch-arc/irqs.h b/include/asm-arm/arch-arc/irqs.h index 48e90b1d7..e4abc83f7 100644 --- a/include/asm-arm/arch-arc/irqs.h +++ b/include/asm-arm/arch-arc/irqs.h @@ -47,3 +47,5 @@ #define FIQ_FORCE 7 #define IRQ_TIMER IRQ_TIMER0 + +#define irq_cannonicalize(i) (i) diff --git a/include/asm-arm/arch-arc/processor.h b/include/asm-arm/arch-arc/processor.h index 3acb4886e..314525eef 100644 --- a/include/asm-arm/arch-arc/processor.h +++ b/include/asm-arm/arch-arc/processor.h @@ -26,7 +26,12 @@ /* This decides where the kernel will search for a free chunk of vm * space during mmap's. */ -#define TASK_UNMAPPED_BASE (TASK_SIZE / 3) +#if 0 +#define TASK_UNMAPPED_BASE(off) (TASK_SIZE / 3) +#else +#define TASK_UNMAPPED_BASE (TASK_SIZE / 3) +#endif +#define TASK_UNMAPPED_ALIGN(addr, off) PAGE_ALIGN(addr) #define INIT_MMAP \ { &init_mm, 0, 0, PAGE_SHARED, VM_READ | VM_WRITE | VM_EXEC, NULL, &init_mm.mmap } diff --git a/include/asm-arm/arch-arc/serial.h b/include/asm-arm/arch-arc/serial.h index 4fdfcdb21..763954175 100644 --- a/include/asm-arm/arch-arc/serial.h +++ b/include/asm-arm/arch-arc/serial.h @@ -25,7 +25,7 @@ #if defined(CONFIG_ARCH_A5K) /* UART CLK PORT IRQ FLAGS */ -#define RS_UARTS \ +#define SERIAL_PORT_DFNS \ { 0, BASE_BAUD, 0x3F8, 10, STD_COM_FLAGS }, /* ttyS0 */ \ { 0, BASE_BAUD, 0x2F8, 10, STD_COM_FLAGS }, /* ttyS1 */ \ { 0, BASE_BAUD, 0 , 0, STD_COM_FLAGS }, /* ttyS2 */ \ @@ -44,7 +44,7 @@ #elif defined(CONFIG_ARCH_ARC) /* UART CLK PORT IRQ FLAGS */ -#define RS_UARTS \ +#define SERIAL_PORT_DFNS \ { 0, BASE_BAUD, 0 , 0, STD_COM_FLAGS }, /* ttyS0 */ \ { 0, BASE_BAUD, 0 , 0, STD_COM_FLAGS }, /* ttyS1 */ \ { 0, BASE_BAUD, 0 , 0, STD_COM_FLAGS }, /* ttyS2 */ \ diff --git a/include/asm-arm/arch-arc/uncompress.h b/include/asm-arm/arch-arc/uncompress.h index f3acb5c25..f378f1166 100644 --- a/include/asm-arm/arch-arc/uncompress.h +++ b/include/asm-arm/arch-arc/uncompress.h @@ -52,7 +52,7 @@ static void puts(const char *s) } } else { ptr = VIDMEM + ((y*video_num_columns*params->bytes_per_char_v+x)*bytes_per_char_h); - ll_write_char(ptr, c|(white<<8)); + ll_write_char(ptr, c|(white<<16)); if ( ++x >= video_num_columns ) { x = 0; if ( ++y >= video_num_lines ) { diff --git a/include/asm-arm/arch-ebsa110/irqs.h b/include/asm-arm/arch-ebsa110/irqs.h index 016686df9..909a6f169 100644 --- a/include/asm-arm/arch-ebsa110/irqs.h +++ b/include/asm-arm/arch-ebsa110/irqs.h @@ -14,3 +14,6 @@ #define IRQ_IMMEDIATE 7 #define IRQ_TIMER IRQ_TIMER0 + +#define irq_cannonicalize(i) (i) + diff --git a/include/asm-arm/arch-ebsa110/processor.h b/include/asm-arm/arch-ebsa110/processor.h index 732c9142c..bf1f6d384 100644 --- a/include/asm-arm/arch-ebsa110/processor.h +++ b/include/asm-arm/arch-ebsa110/processor.h @@ -23,7 +23,12 @@ /* This decides where the kernel will search for a free chunk of vm * space during mmap's. */ -#define TASK_UNMAPPED_BASE (TASK_SIZE / 3) +#if 0 +#define TASK_UNMAPPED_BASE(off) (TASK_SIZE / 3) +#else +#define TASK_UNMAPPED_BASE (TASK_SIZE / 3) +#endif +#define TASK_UNMAPPED_ALIGN(addr, off) PAGE_ALIGN(addr) #define INIT_MMAP \ { &init_mm, 0, 0, PAGE_SHARED, VM_READ | VM_WRITE | VM_EXEC, NULL, &init_mm.mmap } diff --git a/include/asm-arm/arch-ebsa110/serial.h b/include/asm-arm/arch-ebsa110/serial.h index 1d41a7c1d..7388f813b 100644 --- a/include/asm-arm/arch-ebsa110/serial.h +++ b/include/asm-arm/arch-ebsa110/serial.h @@ -21,7 +21,7 @@ #define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST) /* UART CLK PORT IRQ FLAGS */ -#define RS_UARTS \ +#define SERIAL_PORT_DFNS \ { 0, BASE_BAUD, 0x3F8, 1, STD_COM_FLAGS }, /* ttyS0 */ \ { 0, BASE_BAUD, 0x2F8, 2, STD_COM_FLAGS }, /* ttyS1 */ \ { 0, BASE_BAUD, 0 , 0, STD_COM_FLAGS }, /* ttyS2 */ \ diff --git a/include/asm-arm/arch-ebsa285/hardware.h b/include/asm-arm/arch-ebsa285/hardware.h index 8d6af3b1b..a9bc6f0a4 100644 --- a/include/asm-arm/arch-ebsa285/hardware.h +++ b/include/asm-arm/arch-ebsa285/hardware.h @@ -15,15 +15,8 @@ * 0xfd000000 0x78000000 Outbound write flush * 0xfc000000 0x79000000 PCI IACK/special space * - * 0xf9030000 0x7a080000 PCI Config type 1 card 4 - * 0xf9020000 0x7a040000 PCI Config type 1 card 3 - * 0xf9010000 0x7a020000 PCI Config type 1 card 2 - * 0xf9000000 0x7a010000 PCI Config type 1 card 1 - * - * 0xf8030000 0x7b080000 PCI Config type 0 card 4 - * 0xf8020000 0x7b040000 PCI Config type 0 card 3 - * 0xf8010000 0x7b020000 PCI Config type 0 card 2 - * 0xf8000000 0x7b010000 PCI Config type 0 card 1 + * 0xf9000000 0x7a010000 PCI Config type 1 + * 0xf8000000 0x7b010000 PCI Config type 0 * */ diff --git a/include/asm-arm/arch-ebsa285/io.h b/include/asm-arm/arch-ebsa285/io.h index 5142e9126..f42717350 100644 --- a/include/asm-arm/arch-ebsa285/io.h +++ b/include/asm-arm/arch-ebsa285/io.h @@ -140,4 +140,26 @@ DECLARE_IO(long,l,"","Jr") #define inl_t(p) \ (*(volatile unsigned long *)(p)) +/* + * This is not sufficient... (and it's a hack anyway) + */ +static inline void writeb(unsigned char b, unsigned int addr) +{ + *(volatile unsigned char *)(0xe0000000 + (addr)) = b; +} + +static inline unsigned char readb(unsigned int addr) +{ + return *(volatile unsigned char *)(0xe0000000 + (addr)); +} + +static inline void writew(unsigned short b, unsigned int addr) +{ + *(volatile unsigned short *)(0xe0000000 + (addr)) = b; +} + +static inline unsigned short readw(unsigned int addr) +{ + return *(volatile unsigned short *)(0xe0000000 + (addr)); +} #endif diff --git a/include/asm-arm/arch-ebsa285/irqs.h b/include/asm-arm/arch-ebsa285/irqs.h index 108767689..f2ef06c9d 100644 --- a/include/asm-arm/arch-ebsa285/irqs.h +++ b/include/asm-arm/arch-ebsa285/irqs.h @@ -43,3 +43,6 @@ * Now map them to the Linux interrupts */ #define IRQ_TIMER IRQ_TIMER1 + +#define irq_cannonicalize(i) (i) + diff --git a/include/asm-arm/arch-ebsa285/mmu.h b/include/asm-arm/arch-ebsa285/mmu.h index 07006f82e..8e2e98ef6 100644 --- a/include/asm-arm/arch-ebsa285/mmu.h +++ b/include/asm-arm/arch-ebsa285/mmu.h @@ -1,26 +1,25 @@ /* - * linux/include/asm-arm/arch-ebsa110/mmu.h + * linux/include/asm-arm/arch-ebsa285/mmu.h * * Copyright (c) 1996,1997,1998 Russell King. * * Changelog: * 20-10-1996 RMK Created * 31-12-1997 RMK Fixed definitions to reduce warnings + * 17-05-1998 DAG Added __virt_to_bus and __bus_to_virt functions. */ #ifndef __ASM_ARCH_MMU_H #define __ASM_ARCH_MMU_H /* - * On ebsa, the dram is contiguous + * On ebsa285, the dram is contiguous */ #define __virt_to_phys__is_a_macro #define __virt_to_phys(vpage) ((vpage) - PAGE_OFFSET) #define __phys_to_virt__is_a_macro #define __phys_to_virt(ppage) ((ppage) + PAGE_OFFSET) -#define __virt_to_bus__is_a_macro -#define __virt_to_bus(x) __virt_to_phys(x) -#define __bus_to_virt__is_a_macro -#define __bus_to_virt(x) __phys_to_virt(x) +extern unsigned long __virt_to_bus(unsigned long); +extern unsigned long __bus_to_virt(unsigned long); #endif diff --git a/include/asm-arm/arch-ebsa285/processor.h b/include/asm-arm/arch-ebsa285/processor.h index 732c9142c..bf1f6d384 100644 --- a/include/asm-arm/arch-ebsa285/processor.h +++ b/include/asm-arm/arch-ebsa285/processor.h @@ -23,7 +23,12 @@ /* This decides where the kernel will search for a free chunk of vm * space during mmap's. */ -#define TASK_UNMAPPED_BASE (TASK_SIZE / 3) +#if 0 +#define TASK_UNMAPPED_BASE(off) (TASK_SIZE / 3) +#else +#define TASK_UNMAPPED_BASE (TASK_SIZE / 3) +#endif +#define TASK_UNMAPPED_ALIGN(addr, off) PAGE_ALIGN(addr) #define INIT_MMAP \ { &init_mm, 0, 0, PAGE_SHARED, VM_READ | VM_WRITE | VM_EXEC, NULL, &init_mm.mmap } diff --git a/include/asm-arm/arch-ebsa285/serial.h b/include/asm-arm/arch-ebsa285/serial.h new file mode 100644 index 000000000..e824c8d31 --- /dev/null +++ b/include/asm-arm/arch-ebsa285/serial.h @@ -0,0 +1,41 @@ +/* + * linux/include/asm-arm/arch-ebsa285/serial.h + * + * Copyright (c) 1996,1997,1998 Russell King. + * + * Changelog: + * 15-10-1996 RMK Created + */ +#ifndef __ASM_ARCH_SERIAL_H +#define __ASM_ARCH_SERIAL_H + +/* + * This assumes you have a 1.8432 MHz clock for your UART. + * + * It'd be nice if someone built a serial card with a 24.576 MHz + * clock, since the 16550A is capable of handling a top speed of 1.5 + * megabits/second; but this requires the faster clock. + */ +#define BASE_BAUD (1843200 / 16) + +#define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST) + + /* UART CLK PORT IRQ FLAGS */ +#define SERIAL_PORT_DFNS \ + { 0, BASE_BAUD, 0x3F8, 0, STD_COM_FLAGS }, /* ttyS0 */ \ + { 0, BASE_BAUD, 0x2F8, 0, STD_COM_FLAGS }, /* ttyS1 */ \ + { 0, BASE_BAUD, 0 , 0, STD_COM_FLAGS }, /* ttyS2 */ \ + { 0, BASE_BAUD, 0 , 0, STD_COM_FLAGS }, /* ttyS3 */ \ + { 0, BASE_BAUD, 0 , 0, STD_COM_FLAGS }, /* ttyS4 */ \ + { 0, BASE_BAUD, 0 , 0, STD_COM_FLAGS }, /* ttyS5 */ \ + { 0, BASE_BAUD, 0 , 0, STD_COM_FLAGS }, /* ttyS6 */ \ + { 0, BASE_BAUD, 0 , 0, STD_COM_FLAGS }, /* ttyS7 */ \ + { 0, BASE_BAUD, 0 , 0, STD_COM_FLAGS }, /* ttyS8 */ \ + { 0, BASE_BAUD, 0 , 0, STD_COM_FLAGS }, /* ttyS9 */ \ + { 0, BASE_BAUD, 0 , 0, STD_COM_FLAGS }, /* ttyS10 */ \ + { 0, BASE_BAUD, 0 , 0, STD_COM_FLAGS }, /* ttyS11 */ \ + { 0, BASE_BAUD, 0 , 0, STD_COM_FLAGS }, /* ttyS12 */ \ + { 0, BASE_BAUD, 0 , 0, STD_COM_FLAGS }, /* ttyS13 */ + +#endif + diff --git a/include/asm-arm/arch-nexuspci/a.out.h b/include/asm-arm/arch-nexuspci/a.out.h index ad8369c4e..9051eb0c9 100644 --- a/include/asm-arm/arch-nexuspci/a.out.h +++ b/include/asm-arm/arch-nexuspci/a.out.h @@ -1,5 +1,5 @@ /* - * linux/include/asm-arm/arch-ebsa/a.out.h + * linux/include/asm-arm/arch-nexuspci/a.out.h * * Copyright (C) 1996 Russell King */ diff --git a/include/asm-arm/arch-nexuspci/dma.h b/include/asm-arm/arch-nexuspci/dma.h index 9b181743c..83931f566 100644 --- a/include/asm-arm/arch-nexuspci/dma.h +++ b/include/asm-arm/arch-nexuspci/dma.h @@ -1,17 +1,12 @@ /* * linux/include/asm-arm/arch-nexuspci/dma.h * - * Architecture DMA routines + * Architecture DMA routines - NexusPCI has no DMA, so this file is very + * simple. :-) * * Copyright (C) 1998 Philip Blundell */ -#ifndef __ASM_ARCH_DMA_H -#define __ASM_ARCH_DMA_H - -/* NexusPCI has no DMA */ - -#warning No DMA on this platform - -#endif /* _ASM_ARCH_DMA_H */ +/* Need this to keep <asm/dma.h> happy. */ +typedef unsigned int dmamode_t; diff --git a/include/asm-arm/arch-nexuspci/hardware.h b/include/asm-arm/arch-nexuspci/hardware.h index c1534ade6..997569748 100644 --- a/include/asm-arm/arch-nexuspci/hardware.h +++ b/include/asm-arm/arch-nexuspci/hardware.h @@ -1,11 +1,19 @@ /* * linux/include/asm-arm/arch-nexuspci/hardware.h * - * Copyright (C) 1997 Philip Blundell + * Copyright (C) 1998 Philip Blundell * * This file contains the hardware definitions of the Nexus PCI card. */ +/* Logical Physical + * 0xfff00000 0x10000000 SCC2691 DUART + * 0xffe00000 0x20000000 INTCONT + * 0xffd00000 0x30000000 Status + * 0xffc00000 0x60000000 PLX registers + * 0xfe000000 0x70000000 PCI I/O + */ + #ifndef __ASM_ARCH_HARDWARE_H #define __ASM_ARCH_HARDWARE_H @@ -13,29 +21,21 @@ * What hardware must be present */ -#ifndef __ASSEMBLER__ +#define HAS_PCIO +#define PCIO_BASE 0xfe000000 /* * Mapping areas */ #define IO_END 0xffffffff -#define IO_BASE 0xd0000000 +#define IO_BASE 0xfe000000 #define IO_SIZE (IO_END - IO_BASE) -#define IO_START 0xd0000000 /* * RAM definitions */ #define RAM_BASE 0x40000000 -#define MAPTOPHYS(a) ((unsigned long)(a) - PAGE_OFFSET + RAM_BASE) #define KERNTOPHYS(a) ((unsigned long)(&a)) -#define KERNEL_BASE (0xc0008000) #define SAFE_ADDR 0x40000000 -#else - -#define IO_BASE 0 - #endif -#endif - diff --git a/include/asm-arm/arch-nexuspci/io.h b/include/asm-arm/arch-nexuspci/io.h new file mode 100644 index 000000000..5142e9126 --- /dev/null +++ b/include/asm-arm/arch-nexuspci/io.h @@ -0,0 +1,143 @@ +/* + * linux/include/asm-arm/arch-ebsa110/io.h + * + * Copyright (C) 1997,1998 Russell King + * + * Modifications: + * 06-Dec-1997 RMK Created. + */ +#ifndef __ASM_ARM_ARCH_IO_H +#define __ASM_ARM_ARCH_IO_H + +/* + * This architecture does not require any delayed IO, and + * has the constant-optimised IO + */ +#undef ARCH_IO_DELAY + +/* + * Dynamic IO functions - let the compiler + * optimize the expressions + */ +#define DECLARE_DYN_OUT(fnsuffix,instr,typ) \ +extern __inline__ void __out##fnsuffix (unsigned int value, unsigned int port) \ +{ \ + __asm__ __volatile__( \ + "str" ##instr## " %0, [%1, %2]" \ + : \ + : "r" (value), "r" (PCIO_BASE), typ (port)); \ +} + +#define DECLARE_DYN_IN(sz,fnsuffix,instr,typ) \ +extern __inline__ unsigned sz __in##fnsuffix (unsigned int port) \ +{ \ + unsigned long value; \ + __asm__ __volatile__( \ + "ldr" ##instr## " %0, [%1, %2]" \ + : "=&r" (value) \ + : "r" (PCIO_BASE), typ (port)); \ + return (unsigned sz)value; \ +} + +extern __inline__ unsigned int __ioaddr (unsigned int port) \ +{ \ + return (unsigned int)(PCIO_BASE + port); \ +} + +#define DECLARE_IO(sz,fnsuffix,instr,typ) \ + DECLARE_DYN_OUT(fnsuffix,instr,typ) \ + DECLARE_DYN_IN(sz,fnsuffix,instr,typ) + +DECLARE_IO(char,b,"b","Jr") +DECLARE_IO(short,w,"h","r") +DECLARE_IO(long,l,"","Jr") + +#undef DECLARE_IO +#undef DECLARE_DYN_OUT +#undef DECLARE_DYN_IN + +/* + * Constant address IO functions + * + * These have to be macros for the 'J' constraint to work - + * +/-4096 immediate operand. + */ +#define __outbc(value,port) \ +({ \ + __asm__ __volatile__( \ + "strb %0, [%1, %2]" \ + : \ + : "r" (value), "r" (PCIO_BASE), "Jr" (port)); \ +}) + +#define __inbc(port) \ +({ \ + unsigned char result; \ + __asm__ __volatile__( \ + "ldrb %0, [%1, %2]" \ + : "=r" (result) \ + : "r" (PCIO_BASE), "Jr" (port)); \ + result; \ +}) + +#define __outwc(value,port) \ +({ \ + __asm__ __volatile__( \ + "strh %0, [%1, %2]" \ + : \ + : "r" (value), "r" (PCIO_BASE), "r" (port)); \ +}) + +#define __inwc(port) \ +({ \ + unsigned short result; \ + __asm__ __volatile__( \ + "ldrh %0, [%1, %2]" \ + : "=r" (result) \ + : "r" (PCIO_BASE), "r" (port)); \ + result & 0xffff; \ +}) + +#define __outlc(value,port) \ +({ \ + __asm__ __volatile__( \ + "str %0, [%1, %2]" \ + : \ + : "r" (value), "r" (PCIO_BASE), "Jr" (port)); \ +}) + +#define __inlc(port) \ +({ \ + unsigned long result; \ + __asm__ __volatile__( \ + "ldr %0, [%1, %2]" \ + : "=r" (result) \ + : "r" (PCIO_BASE), "Jr" (port)); \ + result; \ +}) + +#define __ioaddrc(port) \ +({ \ + unsigned long addr; \ + addr = PCIO_BASE + port; \ + addr; \ +}) + +/* + * Translated address IO functions + * + * IO address has already been translated to a virtual address + */ +#define outb_t(v,p) \ + (*(volatile unsigned char *)(p) = (v)) + +#define inb_t(p) \ + (*(volatile unsigned char *)(p)) + +#define outl_t(v,p) \ + (*(volatile unsigned long *)(p) = (v)) + +#define inl_t(p) \ + (*(volatile unsigned long *)(p)) + +#endif diff --git a/include/asm-arm/arch-nexuspci/irq.h b/include/asm-arm/arch-nexuspci/irq.h index 18ddf053b..cf25a5dea 100644 --- a/include/asm-arm/arch-nexuspci/irq.h +++ b/include/asm-arm/arch-nexuspci/irq.h @@ -1,46 +1,38 @@ /* - * include/asm-arm/arch-ebsa110/irq.h + * include/asm-arm/arch-nexuspci/irq.h * - * Copyright (C) 1996,1997,1998 Russell King + * Copyright (C) 1998 Philip Blundell */ -#define IRQ_MCLR ((volatile unsigned char *)0xf3000000) -#define IRQ_MSET ((volatile unsigned char *)0xf2c00000) -#define IRQ_MASK ((volatile unsigned char *)0xf2c00000) +#include <asm/io.h> -static __inline__ void mask_and_ack_irq(unsigned int irq) -{ - if (irq < 8) - *IRQ_MCLR = 1 << irq; -} +#define INTCONT 0xffe00000 + +extern unsigned long soft_irq_mask; static __inline__ void mask_irq(unsigned int irq) { - if (irq < 8) - *IRQ_MCLR = 1 << irq; + writel((irq << 1), INTCONT); + soft_irq_mask &= ~(1<<irq); } +#define mask_and_ack_irq(_x) mask_irq(_x) + static __inline__ void unmask_irq(unsigned int irq) { - if (irq < 8) - *IRQ_MSET = 1 << irq; + writel((irq << 1) + 1, INTCONT); + soft_irq_mask |= (1<<irq); } static __inline__ unsigned long get_enabled_irqs(void) { - return 0; + return soft_irq_mask; } static __inline__ void irq_init_irq(void) { - unsigned long flags; - - save_flags_cli (flags); - *IRQ_MCLR = 0xff; - *IRQ_MSET = 0x55; - *IRQ_MSET = 0x00; - if (*IRQ_MASK != 0x55) - while (1); - *IRQ_MCLR = 0xff; /* clear all interrupt enables */ - restore_flags (flags); + unsigned int i; + /* Disable all interrupts initially. */ + for (i = 0; i < NR_IRQS; i++) + mask_irq(i); } diff --git a/include/asm-arm/arch-nexuspci/irqs.h b/include/asm-arm/arch-nexuspci/irqs.h index 054d0675b..69af6e833 100644 --- a/include/asm-arm/arch-nexuspci/irqs.h +++ b/include/asm-arm/arch-nexuspci/irqs.h @@ -1,16 +1,32 @@ /* * linux/include/asm-arm/arch-nexuspci/irqs.h * - * Copyright (C) 1997 Philip Blundell + * Copyright (C) 1997, 1998 Philip Blundell */ -#define IRQ_DUART 0 -#define IRQ_PLX 1 -#define IRQ_PCI_D 2 -#define IRQ_PCI_C 3 -#define IRQ_PCI_B 4 -#define IRQ_PCI_A 5 -#define IRQ_SYSERR 6 +/* Most of the IRQ sources can generate both FIQs and IRQs. + The exceptions to this are the DUART, which can only generate IRQs, + and the PLX SYSERR output, which can only generate FIQs. We route + both FIQs and IRQs through the generic IRQ handling system and the + choice by the driver of which to use is basically an arbitrary one. */ + +#define TREAT_FIQS_AS_IRQS + +#define FIQ_PLX 0 +#define FIQ_PCI_D 1 +#define FIQ_PCI_C 2 +#define FIQ_PCI_B 3 +#define FIQ_PCI_A 4 +#define FIQ_SYSERR 5 + +#define IRQ_DUART 6 +#define IRQ_PLX 7 +#define IRQ_PCI_D 8 +#define IRQ_PCI_C 9 +#define IRQ_PCI_B 10 +#define IRQ_PCI_A 11 /* timer is part of the DUART */ #define IRQ_TIMER IRQ_DUART + +#define irq_cannonicalize(i) (i) diff --git a/include/asm-arm/arch-nexuspci/mmu.h b/include/asm-arm/arch-nexuspci/mmu.h index 6e21320d3..9ecce067f 100644 --- a/include/asm-arm/arch-nexuspci/mmu.h +++ b/include/asm-arm/arch-nexuspci/mmu.h @@ -1,16 +1,26 @@ /* * linux/include/asm-arm/arch-nexuspci/mmu.h * - * Copyright (c) 1997 Philip Blundell. + * Copyright (c) 1997, 1998 Philip Blundell. * */ #ifndef __ASM_ARCH_MMU_H #define __ASM_ARCH_MMU_H /* - * On NexusPCI, the dram is contiguous + * On NexusPCI, the DRAM is contiguous */ #define __virt_to_phys(vpage) ((vpage) - PAGE_OFFSET + 0x40000000) #define __phys_to_virt(ppage) ((ppage) + PAGE_OFFSET - 0x40000000) +#define __virt_to_phys__is_a_macro +#define __phys_to_virt__is_a_macro + +/* + * On the PCI bus the DRAM appears at address 0 + */ +#define __virt_to_bus__is_a_macro +#define __virt_to_bus(x) ((x) - PAGE_OFFSET) +#define __bus_to_virt__is_a_macro +#define __bus_to_virt(x) ((x) + PAGE_OFFSET) #endif diff --git a/include/asm-arm/arch-nexuspci/processor.h b/include/asm-arm/arch-nexuspci/processor.h index 46bf157a4..da9fdd583 100644 --- a/include/asm-arm/arch-nexuspci/processor.h +++ b/include/asm-arm/arch-nexuspci/processor.h @@ -24,7 +24,12 @@ /* This decides where the kernel will search for a free chunk of vm * space during mmap's. */ -#define TASK_UNMAPPED_BASE (TASK_SIZE / 3) +#if 0 +#define TASK_UNMAPPED_BASE(off) (TASK_SIZE / 3) +#else +#define TASK_UNMAPPED_BASE (TASK_SIZE / 3) +#endif +#define TASK_UNMAPPED_ALIGN(addr, off) PAGE_ALIGN(addr) #define INIT_MMAP \ { &init_mm, 0, 0, PAGE_SHARED, VM_READ | VM_WRITE | VM_EXEC, NULL, &init_mm.mmap } diff --git a/include/asm-arm/arch-nexuspci/shmparam.h b/include/asm-arm/arch-nexuspci/shmparam.h index 9c36489cb..191bd514d 100644 --- a/include/asm-arm/arch-nexuspci/shmparam.h +++ b/include/asm-arm/arch-nexuspci/shmparam.h @@ -1,5 +1,5 @@ /* - * linux/include/asm-arm/arch-ebsa110/shmparam.h + * linux/include/asm-arm/arch-nexuspci/shmparam.h * * Copyright (c) 1996 Russell King. */ diff --git a/include/asm-arm/arch-nexuspci/system.h b/include/asm-arm/arch-nexuspci/system.h index 7a2957cae..7042dc436 100644 --- a/include/asm-arm/arch-nexuspci/system.h +++ b/include/asm-arm/arch-nexuspci/system.h @@ -1,5 +1,5 @@ /* - * linux/include/asm-arm/arch-ebsa110/system.h + * linux/include/asm-arm/arch-nexuspci/system.h * * Copyright (c) 1996,1997,1998 Russell King. */ @@ -9,7 +9,7 @@ extern __inline__ void arch_hard_reset (void) { /* - * loop endlessly + * loop endlessly - the watchdog will reset us if it's enabled. */ cli(); while (1); diff --git a/include/asm-arm/arch-nexuspci/time.h b/include/asm-arm/arch-nexuspci/time.h index ddbee82db..1f3fa401f 100644 --- a/include/asm-arm/arch-nexuspci/time.h +++ b/include/asm-arm/arch-nexuspci/time.h @@ -3,10 +3,15 @@ * * Copyright (c) 1997 Phil Blundell. * - * Nexus PCI card has no real-time clock. - * + * Nexus PCI card has no real-time clock. We get timer ticks from the + * SCC chip. */ +#define UART_BASE 0xfff00000 +#define INTCONT 0xffe00000 + +#define update_rtc() + extern __inline__ unsigned long gettimeoffset (void) { return 0; @@ -14,12 +19,31 @@ extern __inline__ unsigned long gettimeoffset (void) extern __inline__ int reset_timer (void) { - return 0; + static int count = 50; + writeb(0x90, UART_BASE + 8); + if (--count == 0) + { + static int state = 1; + state ^= 1; + writeb(0x1a + state, INTCONT); + count = 50; + } + readb(UART_BASE + 0x14); + readb(UART_BASE + 0x14); + readb(UART_BASE + 0x14); + readb(UART_BASE + 0x14); + readb(UART_BASE + 0x14); + readb(UART_BASE + 0x14); + return 1; } extern __inline__ unsigned long setup_timer (void) { - reset_timer (); + int tick = 3686400 / 16 / 2 / 100; + writeb(tick & 0xff, UART_BASE + 0x1c); + writeb(tick >> 8, UART_BASE + 0x18); + writeb(0x80, UART_BASE + 8); + writeb(0x10, UART_BASE + 0x14); /* * Default the date to 1 Jan 1970 0:0:0 * You will have to run a time daemon to set the diff --git a/include/asm-arm/arch-nexuspci/timex.h b/include/asm-arm/arch-nexuspci/timex.h new file mode 100644 index 000000000..63d4e2cd1 --- /dev/null +++ b/include/asm-arm/arch-nexuspci/timex.h @@ -0,0 +1,8 @@ +/* + * linux/include/asm-arm/arch-nexuspci/timex.h + * + * NexusPCI StrongARM card timex specifications + * + * Copyright (C) 1998 Philip Blundell + */ + diff --git a/include/asm-arm/arch-rpc/hardware.h b/include/asm-arm/arch-rpc/hardware.h index 75e112e98..706992b78 100644 --- a/include/asm-arm/arch-rpc/hardware.h +++ b/include/asm-arm/arch-rpc/hardware.h @@ -53,7 +53,7 @@ /* * Mapping areas */ -#define IO_END 0xe0ffffff +#define IO_END 0xe1000000 #define IO_BASE 0xe0000000 #define IO_SIZE (IO_END - IO_BASE) diff --git a/include/asm-arm/arch-rpc/ide.h b/include/asm-arm/arch-rpc/ide.h index 49463bae0..311a98853 100644 --- a/include/asm-arm/arch-rpc/ide.h +++ b/include/asm-arm/arch-rpc/ide.h @@ -3,12 +3,13 @@ * * Copyright (c) 1997 Russell King */ +#include <asm/irq.h> static __inline__ int ide_default_irq(ide_ioreg_t base) { if (base == 0x1f0) - return 9; + return IRQ_HARDDISK; return 0; } @@ -40,5 +41,5 @@ ide_init_hwif_ports (ide_ioreg_t *p, ide_ioreg_t base, int stepping, int *irq) } *p++ = ctrl; if (irq != NULL) - irq = 0; + *irq = 0; } diff --git a/include/asm-arm/arch-rpc/irqs.h b/include/asm-arm/arch-rpc/irqs.h index 9adbc9c61..1faaf758e 100644 --- a/include/asm-arm/arch-rpc/irqs.h +++ b/include/asm-arm/arch-rpc/irqs.h @@ -1,5 +1,5 @@ /* - * linux/include/asm-arm/arch-a5k/irqs.h + * linux/include/asm-arm/arch-rpc/irqs.h * * Copyright (C) 1996 Russell King */ @@ -13,9 +13,8 @@ #define IRQ_TIMER1 6 #define IRQ_IMMEDIATE 7 #define IRQ_EXPCARDFIQ 8 -#define IRQ_SOUNDCHANGE 9 +#define IRQ_HARDDISK 9 #define IRQ_SERIALPORT 10 -#define IRQ_HARDDISK 11 #define IRQ_FLOPPYDISK 12 #define IRQ_EXPANSIONCARD 13 #define IRQ_KEYBOARDTX 14 @@ -35,3 +34,6 @@ #define FIQ_FORCE 7 #define IRQ_TIMER IRQ_TIMER0 + +#define irq_cannonicalize(i) (i) + diff --git a/include/asm-arm/arch-rpc/keyboard.h b/include/asm-arm/arch-rpc/keyboard.h index 60d3f0b8c..44090e122 100644 --- a/include/asm-arm/arch-rpc/keyboard.h +++ b/include/asm-arm/arch-rpc/keyboard.h @@ -28,7 +28,11 @@ extern unsigned char ps2kbd_sysrq_xlate[NR_SCANCODES]; * Returns : 0 to ignore scancode, *keycode set to keycode, *up_flag * set to 0200 if scancode indicates release */ +#ifdef NEW_KEYBOARD #define kbd_translate(sc, kcp, ufp, rm) ps2kbd_translate(sc, kcp, ufp) +#else +#define kbd_translate(sc, kcp, rm) ({ unsigned int up_flag; ps2kbd_translate(sc, kcp, &up_flag); }) +#endif #define kbd_unexpected_up(kc) (0200) #define kbd_leds(leds) ps2kbd_leds(leds) #define kbd_init_hw() ps2kbd_init_hw() diff --git a/include/asm-arm/arch-rpc/processor.h b/include/asm-arm/arch-rpc/processor.h index 61ab21538..cdb79eeed 100644 --- a/include/asm-arm/arch-rpc/processor.h +++ b/include/asm-arm/arch-rpc/processor.h @@ -26,7 +26,12 @@ /* This decides where the kernel will search for a free chunk of vm * space during mmap's. */ -#define TASK_UNMAPPED_BASE (TASK_SIZE / 3) +#if 0 +#define TASK_UNMAPPED_BASE(off) (TASK_SIZE / 3) +#else +#define TASK_UNMAPPED_BASE (TASK_SIZE / 3) +#endif +#define TASK_UNMAPPED_ALIGN(addr, off) PAGE_ALIGN(addr) #define INIT_MMAP \ { &init_mm, 0, 0, PAGE_SHARED, VM_READ | VM_WRITE | VM_EXEC, NULL, &init_mm.mmap } diff --git a/include/asm-arm/arch-rpc/serial.h b/include/asm-arm/arch-rpc/serial.h index 2718276cb..8c33a7964 100644 --- a/include/asm-arm/arch-rpc/serial.h +++ b/include/asm-arm/arch-rpc/serial.h @@ -21,7 +21,7 @@ #define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST) /* UART CLK PORT IRQ FLAGS */ -#define RS_UARTS \ +#define SERIAL_PORT_DFNS \ { 0, BASE_BAUD, 0x3F8, 10, STD_COM_FLAGS }, /* ttyS0 */ \ { 0, BASE_BAUD, 0x2F8, 10, STD_COM_FLAGS }, /* ttyS1 */ \ { 0, BASE_BAUD, 0 , 0, STD_COM_FLAGS }, /* ttyS2 */ \ diff --git a/include/asm-arm/arch-vnc/a.out.h b/include/asm-arm/arch-vnc/a.out.h new file mode 100644 index 000000000..0123eb29a --- /dev/null +++ b/include/asm-arm/arch-vnc/a.out.h @@ -0,0 +1,16 @@ +/* + * linux/include/asm-arm/arch-ebsa110/a.out.h + * + * Copyright (C) 1996 Russell King + */ + +#ifndef __ASM_ARCH_A_OUT_H +#define __ASM_ARCH_A_OUT_H + +#ifdef __KERNEL__ +#define STACK_TOP ((current->personality==PER_LINUX_32BIT)? 0xc0000000 : 0x04000000) +#define LIBRARY_START_TEXT (0x00c00000) +#endif + +#endif + diff --git a/include/asm-arm/arch-vnc/dma.h b/include/asm-arm/arch-vnc/dma.h new file mode 100644 index 000000000..96a265927 --- /dev/null +++ b/include/asm-arm/arch-vnc/dma.h @@ -0,0 +1,29 @@ +/* + * linux/include/asm-arm/arch-ebsa110/dma.h + * + * Architecture DMA routes + * + * Copyright (C) 1997.1998 Russell King + */ +#ifndef __ASM_ARCH_DMA_H +#define __ASM_ARCH_DMA_H + +/* + * This is the maximum DMA address that can be DMAd to. + * There should not be more than (0xd0000000 - 0xc0000000) + * bytes of RAM. + */ +#define MAX_DMA_ADDRESS 0xd0000000 + +/* + * DMA modes - we have two, IN and OUT + */ +typedef enum { + DMA_MODE_READ, + DMA_MODE_WRITE +} dmamode_t; + +#define MAX_DMA_CHANNELS 8 + +#endif /* _ASM_ARCH_DMA_H */ + diff --git a/include/asm-arm/arch-vnc/hardware.h b/include/asm-arm/arch-vnc/hardware.h new file mode 100644 index 000000000..947456659 --- /dev/null +++ b/include/asm-arm/arch-vnc/hardware.h @@ -0,0 +1,121 @@ +/* + * linux/include/asm-arm/arch-vnc/hardware.h + * + * Copyright (C) 1998 Corel Computer/Russell King. + * + * This file contains the hardware definitions of the VNC. + */ + +/* Logical Physical + * 0xfff00000 0x40000000 X-Bus + * 0xffe00000 0x7c000000 PCI I/O space + * + * 0xfe000000 0x42000000 CSR + * 0xfd000000 0x78000000 Outbound write flush + * 0xfc000000 0x79000000 PCI IACK/special space + * + * 0xf9030000 0x7a080000 PCI Config type 1 card 4 + * 0xf9020000 0x7a040000 PCI Config type 1 card 3 + * 0xf9010000 0x7a020000 PCI Config type 1 card 2 + * 0xf9000000 0x7a010000 PCI Config type 1 card 1 + * + * 0xf8030000 0x7b080000 PCI Config type 0 card 4 + * 0xf8020000 0x7b040000 PCI Config type 0 card 3 + * 0xf8010000 0x7b020000 PCI Config type 0 card 2 + * 0xf8000000 0x7b010000 PCI Config type 0 card 1 + * + */ + +/* + * DEC21285 + */ +#define CSR_SA110_CNTL ((volatile unsigned long *)0xfe00013c) +#define CSR_PCIADDR_EXTN ((volatile unsigned long *)0xfe000140) +#define CSR_PREFETCHMEMRANGE ((volatile unsigned long *)0xfe000144) +#define CSR_XBUS_CYCLE ((volatile unsigned long *)0xfe000148) +#define CSR_XBUS_IOSTROBE ((volatile unsigned long *)0xfe00014c) +#define CSR_DOORBELL_PCI ((volatile unsigned long *)0xfe000150) +#define CSR_DOORBELL_SA110 ((volatile unsigned long *)0xfe000154) + + +#define CSR_UARTDR ((volatile unsigned long *)0xfe000160) +#define CSR_RXSTAT ((volatile unsigned long *)0xfe000164) +#define CSR_H_UBRLCR ((volatile unsigned long *)0xfe000168) +#define CSR_M_UBRLCR ((volatile unsigned long *)0xfe00016c) +#define CSR_L_UBRLCR ((volatile unsigned long *)0xfe000170) +#define CSR_UARTCON ((volatile unsigned long *)0xfe000174) +#define CSR_UARTFLG ((volatile unsigned long *)0xfe000178) + +#define CSR_IRQ_STATUS ((volatile unsigned long *)0xfe000180) +#define CSR_IRQ_RAWSTATUS ((volatile unsigned long *)0xfe000184) +#define CSR_IRQ_ENABLE ((volatile unsigned long *)0xfe000188) +#define CSR_IRQ_DISABLE ((volatile unsigned long *)0xfe00018c) +#define CSR_IRQ_SOFT ((volatile unsigned long *)0xfe000190) + +#define CSR_FIQ_STATUS ((volatile unsigned long *)0xfe000280) +#define CSR_FIQ_RAWSTATUS ((volatile unsigned long *)0xfe000284) +#define CSR_FIQ_ENABLE ((volatile unsigned long *)0xfe000288) +#define CSR_FIQ_DISABLE ((volatile unsigned long *)0xfe00028c) +#define CSR_FIQ_SOFT ((volatile unsigned long *)0xfe000290) + +#define CSR_TIMER1_LOAD ((volatile unsigned long *)0xfe000300) +#define CSR_TIMER1_VALUE ((volatile unsigned long *)0xfe000304) +#define CSR_TIMER1_CNTL ((volatile unsigned long *)0xfe000308) +#define CSR_TIMER1_CLR ((volatile unsigned long *)0xfe00030c) + +#define CSR_TIMER2_LOAD ((volatile unsigned long *)0xfe000320) +#define CSR_TIMER2_VALUE ((volatile unsigned long *)0xfe000324) +#define CSR_TIMER2_CNTL ((volatile unsigned long *)0xfe000328) +#define CSR_TIMER2_CLR ((volatile unsigned long *)0xfe00032c) + +#define CSR_TIMER3_LOAD ((volatile unsigned long *)0xfe000340) +#define CSR_TIMER3_VALUE ((volatile unsigned long *)0xfe000344) +#define CSR_TIMER3_CNTL ((volatile unsigned long *)0xfe000348) +#define CSR_TIMER3_CLR ((volatile unsigned long *)0xfe00034c) + +#define CSR_TIMER4_LOAD ((volatile unsigned long *)0xfe000360) +#define CSR_TIMER4_VALUE ((volatile unsigned long *)0xfe000364) +#define CSR_TIMER4_CNTL ((volatile unsigned long *)0xfe000368) +#define CSR_TIMER4_CLR ((volatile unsigned long *)0xfe00036c) + +#define TIMER_CNTL_ENABLE (1 << 7) +#define TIMER_CNTL_AUTORELOAD (1 << 6) +#define TIMER_CNTL_DIV1 (0) +#define TIMER_CNTL_DIV16 (1 << 2) +#define TIMER_CNTL_DIV256 (2 << 2) +#define TIMER_CNTL_CNTEXT (3 << 2) + +/* LEDs */ +#define XBUS_LEDS ((volatile unsigned char *)0xfff12000) +#define XBUS_LED_AMBER (1 << 0) +#define XBUS_LED_GREEN (1 << 1) +#define XBUS_LED_RED (1 << 2) +#define XBUS_LED_TOGGLE (1 << 8) + +/* PIC irq control */ +#define PIC_LO 0x20 +#define PIC_MASK_LO 0x21 +#define PIC_HI 0xA0 +#define PIC_MASK_HI 0xA1 + +#define IO_END 0xffffffff +#define IO_BASE 0xe0000000 +#define IO_SIZE (IO_END - IO_BASE) + +#define HAS_PCIO + +#define XBUS_SWITCH ((volatile unsigned char *)0xfff12000) +#define XBUS_SWITCH_SWITCH ((*XBUS_SWITCH) & 15) +#define XBUS_SWITCH_J17_13 ((*XBUS_SWITCH) & (1 << 4)) +#define XBUS_SWITCH_J17_11 ((*XBUS_SWITCH) & (1 << 5)) +#define XBUS_SWITCH_J17_9 ((*XBUS_SWITCH) & (1 << 6)) + +#define PCIO_BASE 0xffe00000 + +#define KERNTOPHYS(a) ((unsigned long)(&a)) + +#define PARAMS_OFFSET 0x0100 +#define PARAMS_BASE (PAGE_OFFSET + PARAMS_OFFSET) + +#define SAFE_ADDR 0x50000000 + diff --git a/include/asm-arm/arch-vnc/ide.h b/include/asm-arm/arch-vnc/ide.h new file mode 100644 index 000000000..35eff5c28 --- /dev/null +++ b/include/asm-arm/arch-vnc/ide.h @@ -0,0 +1 @@ +/* no ide */ diff --git a/include/asm-arm/arch-vnc/io.h b/include/asm-arm/arch-vnc/io.h new file mode 100644 index 000000000..83d25d363 --- /dev/null +++ b/include/asm-arm/arch-vnc/io.h @@ -0,0 +1,176 @@ +/* + * linux/include/asm-arm/arch-ebsa110/io.h + * + * Copyright (C) 1997,1998 Russell King + * + * Modifications: + * 06-Dec-1997 RMK Created. + */ +#ifndef __ASM_ARM_ARCH_IO_H +#define __ASM_ARM_ARCH_IO_H + +/* + * This architecture does not require any delayed IO, and + * has the constant-optimised IO + */ +#undef ARCH_IO_DELAY + +/* + * Dynamic IO functions - let the compiler + * optimize the expressions + */ +#define DECLARE_DYN_OUT(fnsuffix,instr,typ) \ +extern __inline__ void __out##fnsuffix (unsigned int value, unsigned int port) \ +{ \ + __asm__ __volatile__( \ + "str" ##instr## " %0, [%1, %2]" \ + : \ + : "r" (value), "r" (PCIO_BASE), typ (port)); \ +} + +#define DECLARE_DYN_IN(sz,fnsuffix,instr,typ) \ +extern __inline__ unsigned sz __in##fnsuffix (unsigned int port) \ +{ \ + unsigned long value; \ + __asm__ __volatile__( \ + "ldr" ##instr## " %0, [%1, %2]" \ + : "=&r" (value) \ + : "r" (PCIO_BASE), typ (port)); \ + return (unsigned sz)value; \ +} + +extern __inline__ unsigned int __ioaddr (unsigned int port) \ +{ \ + return (unsigned int)(PCIO_BASE + port); \ +} + +#define DECLARE_IO(sz,fnsuffix,instr,typ) \ + DECLARE_DYN_OUT(fnsuffix,instr,typ) \ + DECLARE_DYN_IN(sz,fnsuffix,instr,typ) + +DECLARE_IO(char,b,"b","Jr") +DECLARE_IO(short,w,"h","r") +DECLARE_IO(long,l,"","Jr") + +#undef DECLARE_IO +#undef DECLARE_DYN_OUT +#undef DECLARE_DYN_IN + +/* + * Constant address IO functions + * + * These have to be macros for the 'J' constraint to work - + * +/-4096 immediate operand. + */ +#define __outbc(value,port) \ +({ \ + __asm__ __volatile__( \ + "strb %0, [%1, %2]" \ + : \ + : "r" (value), "r" (PCIO_BASE), "Jr" (port)); \ +}) + +#define __inbc(port) \ +({ \ + unsigned char result; \ + __asm__ __volatile__( \ + "ldrb %0, [%1, %2]" \ + : "=r" (result) \ + : "r" (PCIO_BASE), "Jr" (port)); \ + result; \ +}) + +#define __outwc(value,port) \ +({ \ + __asm__ __volatile__( \ + "strh %0, [%1, %2]" \ + : \ + : "r" (value), "r" (PCIO_BASE), "r" (port)); \ +}) + +#define __inwc(port) \ +({ \ + unsigned short result; \ + __asm__ __volatile__( \ + "ldrh %0, [%1, %2]" \ + : "=r" (result) \ + : "r" (PCIO_BASE), "r" (port)); \ + result & 0xffff; \ +}) + +#define __outlc(value,port) \ +({ \ + __asm__ __volatile__( \ + "str %0, [%1, %2]" \ + : \ + : "r" (value), "r" (PCIO_BASE), "Jr" (port)); \ +}) + +#define __inlc(port) \ +({ \ + unsigned long result; \ + __asm__ __volatile__( \ + "ldr %0, [%1, %2]" \ + : "=r" (result) \ + : "r" (PCIO_BASE), "Jr" (port)); \ + result; \ +}) + +#define __ioaddrc(port) \ +({ \ + unsigned long addr; \ + addr = PCIO_BASE + port; \ + addr; \ +}) + +/* + * Translated address IO functions + * + * IO address has already been translated to a virtual address + */ +#define outb_t(v,p) \ + (*(volatile unsigned char *)(p) = (v)) + +#define inb_t(p) \ + (*(volatile unsigned char *)(p)) + +#define outl_t(v,p) \ + (*(volatile unsigned long *)(p) = (v)) + +#define inl_t(p) \ + (*(volatile unsigned long *)(p)) + +/* + * This is not sufficient... (and it's a hack anyway) + */ +static inline void writeb(unsigned char b, unsigned int addr) +{ + *(volatile unsigned char *)(0xe0000000 + (addr)) = b; +} + +static inline unsigned char readb(unsigned int addr) +{ + return *(volatile unsigned char *)(0xe0000000 + (addr)); +} + +static inline void writew(unsigned short b, unsigned int addr) +{ + *(volatile unsigned short *)(0xe0000000 + (addr)) = b; +} + +static inline unsigned short readw(unsigned int addr) +{ + return *(volatile unsigned short *)(0xe0000000 + (addr)); +} + +static inline void writew(unsigned long b, unsigned int addr) +{ + *(volatile unsigned long *)(0xe0000000 + (addr)) = b; +} + +static inline unsigned long readw(unsigned int addr) +{ + return *(volatile unsigned long *)(0xe0000000 + (addr)); +} + +#endif diff --git a/include/asm-arm/arch-vnc/irq.h b/include/asm-arm/arch-vnc/irq.h new file mode 100644 index 000000000..2273d433b --- /dev/null +++ b/include/asm-arm/arch-vnc/irq.h @@ -0,0 +1,106 @@ +/* + * include/asm-arm/arch-vnc/irq.h + * + * Copyright (C) 1998 Russell King + */ + +#include <asm/irq.h> + +/* + * FootBridge IRQ translation table + * Converts form our IRQ numbers into FootBridge masks (defined in irqs.h) + */ +static int fb_irq_mask[16] = { + 0, + IRQ_MASK_SOFTIRQ, + IRQ_MASK_UART_DEBUG, + 0, + IRQ_MASK_TIMER0, + IRQ_MASK_TIMER1, + IRQ_MASK_TIMER2, + IRQ_MASK_WATCHDOG, + IRQ_MASK_ETHER10, + IRQ_MASK_ETHER100, + IRQ_MASK_VIDCOMP, + IRQ_MASK_EXTERN_IRQ, + IRQ_MASK_DMA1, + 0, + 0, + IRQ_MASK_PCI_ERR +}; + +static __inline__ void mask_and_ack_irq(unsigned int irq) +{ + if (irq < 16) + *CSR_IRQ_DISABLE = fb_irq_mask[irq]; + else { + unsigned int pic_mask, mask; + + if (irq < 24) + pic_mask = PIC_MASK_LO; + else + pic_mask = PIC_MASK_HI; + + mask = 1 << (irq & 7); + + outb(inb(pic_mask) | mask, pic_mask); + } +} + +static __inline__ void mask_irq(unsigned int irq) +{ + if (irq < 16) + *CSR_IRQ_DISABLE = fb_irq_mask[irq]; + else { + unsigned int pic_mask, mask; + + if (irq < 24) + pic_mask = PIC_MASK_LO; + else + pic_mask = PIC_MASK_HI; + + mask = 1 << (irq & 7); + + outb(inb(pic_mask) | mask, pic_mask); + } +} + +static __inline__ void unmask_irq(unsigned int irq) +{ + if (irq < 16) + *CSR_IRQ_ENABLE = fb_irq_mask[irq]; + else { + unsigned int pic_mask, mask; + + if (irq < 24) + pic_mask = PIC_MASK_LO; + else + pic_mask = PIC_MASK_HI; + + mask = 1 << (irq & 7); + + outb(inb(pic_mask) & ~mask, pic_mask); + } +} + +static __inline__ unsigned long get_enabled_irqs(void) +{ + return 0; +} + +static __inline__ void irq_init_irq(void) +{ + outb(0x11, PIC_LO); + outb(0x10, PIC_MASK_LO); + outb(0x04, PIC_MASK_LO); + outb(1, PIC_MASK_LO); + + outb(0x11, PIC_HI); + outb(0x18, PIC_MASK_HI); + outb(0x02, PIC_MASK_HI); + outb(1, PIC_MASK_HI); + + *CSR_IRQ_DISABLE = ~IRQ_MASK_EXTERN_IRQ; + *CSR_IRQ_ENABLE = IRQ_MASK_EXTERN_IRQ; + *CSR_FIQ_DISABLE = -1; +} diff --git a/include/asm-arm/arch-vnc/irqs.h b/include/asm-arm/arch-vnc/irqs.h new file mode 100644 index 000000000..53e01a1d6 --- /dev/null +++ b/include/asm-arm/arch-vnc/irqs.h @@ -0,0 +1,63 @@ +/* + * linux/include/asm-arm/arch-vnc/irqs.h + * + * Copyright (C) 1998 Russell King + */ + +#define NR_IRQS 32 + +/* + * This is a list of all interrupts that the 21285 + * can generate + */ +#define IRQ_SOFTIRQ 1 /* from FB.1 */ +#define IRQ_CONRX 2 /* from FB.2 */ +#define IRQ_CONTX 3 /* from FB.3 */ +#define IRQ_TIMER0 4 /* from FB.4 */ +#define IRQ_TIMER1 5 /* from FB.5 */ +#define IRQ_TIMER2 6 /* from FB.6 */ +#define IRQ_WATCHDOG 7 /* from FB.7 */ +#define IRQ_ETHER10 8 /* from FB.8 */ +#define IRQ_ETHER100 9 /* from FB.9 */ +#define IRQ_VIDCOMP 10 /* from FB.10 */ +#define IRQ_EXTERN_IRQ 11 /* from FB.11: chain to IDE irq's */ +#define IRQ_DMA1 12 /* from future */ +#define IRQ_PCI_ERR 15 /* from FB.[28:31] */ + +#define IRQ_TIMER4 16 /* from 553.0 */ +#define IRQ_KEYBOARD 17 /* from 553.1 */ +#define IRQ_PIC_HI 18 /* from 533.2: chained to 553.[8:15] */ +#define IRQ_UART2 19 /* from 553.3 */ +#define IRQ_UART 20 /* from 553.4 */ +#define IRQ_MOUSE 21 /* from 553.5 */ +#define IRQ_UART_IR 22 /* from 553.6 */ +#define IRQ_PRINTER 23 /* from 553.7 */ +#define IRQ_RTC_ALARM 24 /* from 553.8 */ +#define IRQ_POWERLOW 26 /* from 553.10 */ +#define IRQ_VGA 27 /* from 553.11 */ +#define IRQ_SOUND 28 /* from 553.12 */ +#define IRQ_HARDDISK 30 /* from 553.14 */ + +/* These defines handle the translation from the above FB #defines + * into physical buts for the FootBridge IRQ registers + */ +#define IRQ_MASK_SOFTIRQ 0x00000002 +#define IRQ_MASK_UART_DEBUG 0x0000000C +#define IRQ_MASK_TIMER0 0x00000010 +#define IRQ_MASK_TIMER1 0x00000020 +#define IRQ_MASK_TIMER2 0x00000040 +#define IRQ_MASK_WATCHDOG 0x00000080 +#define IRQ_MASK_ETHERH10 0x00000100 +#define IRQ_MASK_ETHERH100 0x00000200 +#define IRQ_MASK_VIDCOMP 0x00000400 +#define IRQ_MASK_EXTERN_IRQ 0x00000800 +#define IRQ_MASK_DMA1 0x00030000 +#define IRQ_MASK_PCI_ERR 0xf0000000 + +/* + * Now map them to the Linux interrupts + */ +#define IRQ_TIMER IRQ_TIMER0 + +#define irq_cannonicalize(i) (i) + diff --git a/include/asm-arm/arch-vnc/keyboard.h b/include/asm-arm/arch-vnc/keyboard.h new file mode 100644 index 000000000..4620ff165 --- /dev/null +++ b/include/asm-arm/arch-vnc/keyboard.h @@ -0,0 +1,37 @@ +/* + * linux/include/asm-arm/arch-ebsa285/keyboard.h + * + * Keyboard driver definitions for EBSA285 architecture + * + * (C) 1998 Russell King + */ + +#include <linux/config.h> +#include <asm/irq.h> + +#define NR_SCANCODES 128 + +#ifdef CONFIG_MAGIC_SYSRQ +static unsigned char kbd_sysrq_xlate[NR_SCANCODES]; +#endif + +#define kbd_setkeycode(sc,kc) (-EINVAL) +#define kbd_getkeycode(sc) (-EINVAL) + +/* Prototype: int kbd_pretranslate(scancode, raw_mode) + * Returns : 0 to ignore scancode + */ +#define kbd_pretranslate(sc,rm) (1) + +/* Prototype: int kbd_translate(scancode, *keycode, *up_flag, raw_mode) + * Returns : 0 to ignore scancode, *keycode set to keycode, *up_flag + * set to 0200 if scancode indicates release + */ +#define kbd_translate(sc, kcp, ufp, rm) (1) +#define kbd_unexpected_up(kc) (0200) +#define kbd_leds(leds) +#define kbd_init_hw() +//#define kbd_sysrq_xlate ps2kbd_sysrq_xlate +#define kbd_disable_irq() +#define kbd_enable_irq() + diff --git a/include/asm-arm/arch-vnc/mm-init.h b/include/asm-arm/arch-vnc/mm-init.h new file mode 100644 index 000000000..c6937abd0 --- /dev/null +++ b/include/asm-arm/arch-vnc/mm-init.h @@ -0,0 +1,5 @@ +/* + * linux/include/asm-arm/arch-ebsa110/mmap.h + * + * Copyright (C) 1996,1997,1998 Russell King + */ diff --git a/include/asm-arm/arch-vnc/mmu.h b/include/asm-arm/arch-vnc/mmu.h new file mode 100644 index 000000000..85307d717 --- /dev/null +++ b/include/asm-arm/arch-vnc/mmu.h @@ -0,0 +1,26 @@ +/* + * linux/include/asm-arm/arch-ebsa110/mmu.h + * + * Copyright (c) 1996,1997,1998 Russell King. + * + * Changelog: + * 20-10-1996 RMK Created + * 31-12-1997 RMK Fixed definitions to reduce warnings + */ +#ifndef __ASM_ARCH_MMU_H +#define __ASM_ARCH_MMU_H + +/* + * On ebsa, the dram is contiguous + */ +#define __virt_to_phys__is_a_macro +#define __virt_to_phys(vpage) ((vpage) - PAGE_OFFSET) +#define __phys_to_virt__is_a_macro +#define __phys_to_virt(ppage) ((ppage) + PAGE_OFFSET) + +#define __virt_to_bus__is_a_macro +#define __virt_to_bus(x) (x) +#define __bus_to_virt__is_a_macro +#define __bus_to_virt(x) (x) + +#endif diff --git a/include/asm-arm/arch-vnc/oldlatches.h b/include/asm-arm/arch-vnc/oldlatches.h new file mode 100644 index 000000000..8ff6ebd67 --- /dev/null +++ b/include/asm-arm/arch-vnc/oldlatches.h @@ -0,0 +1,9 @@ +/* + * Dummy oldlatches.h + * + * Copyright (C) 1996 Russell King + */ + +#ifdef __need_oldlatches +#error "Old latches not present in this (rpc) machine" +#endif diff --git a/include/asm-arm/arch-vnc/processor.h b/include/asm-arm/arch-vnc/processor.h new file mode 100644 index 000000000..5d84ad498 --- /dev/null +++ b/include/asm-arm/arch-vnc/processor.h @@ -0,0 +1,31 @@ +/* + * linux/include/asm-arm/arch-vnc/processor.h + * + * Copyright (C) 1996,1997,1998 Russell King + */ + +#ifndef __ASM_ARCH_PROCESSOR_H +#define __ASM_ARCH_PROCESSOR_H + +/* + * Bus types + */ +#define EISA_bus 0 +#define EISA_bus__is_a_macro /* for versions in ksyms.c */ +#define MCA_bus 0 +#define MCA_bus__is_a_macro /* for versions in ksyms.c */ + +/* + * User space: 3GB + */ +#define TASK_SIZE (0xc0000000UL) + +/* This decides where the kernel will search for a free chunk of vm + * space during mmap's. + */ +#define TASK_UNMAPPED_BASE (TASK_SIZE / 3) + +#define INIT_MMAP \ +{ &init_mm, 0, 0, PAGE_SHARED, VM_READ | VM_WRITE | VM_EXEC, NULL, &init_mm.mmap } + +#endif diff --git a/include/asm-arm/arch-vnc/serial.h b/include/asm-arm/arch-vnc/serial.h new file mode 100644 index 000000000..74fea49ce --- /dev/null +++ b/include/asm-arm/arch-vnc/serial.h @@ -0,0 +1,43 @@ +/* + * linux/include/asm-arm/arch-vnc/serial.h + * + * Copyright (c) 1996 Russell King. + * + * Changelog: + * 15-10-1996 RMK Created + * 03-05-1998 RMK Modified for Corel Video NC + */ +#ifndef __ASM_ARCH_SERIAL_H +#define __ASM_ARCH_SERIAL_H + +#include <asm/irq.h> + +/* + * This assumes you have a 1.8432 MHz clock for your UART. + * + * It'd be nice if someone built a serial card with a 24.576 MHz + * clock, since the 16550A is capable of handling a top speed of 1.5 + * megabits/second; but this requires the faster clock. + */ +#define BASE_BAUD (1843200 / 16) + +#define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST) + + /* UART CLK PORT IRQ FLAGS */ +#define SERIAL_PORT_DFNS \ + { 0, BASE_BAUD, 0x3F8, IRQ_UART , STD_COM_FLAGS }, /* ttyS0 */ \ + { 0, BASE_BAUD, 0x2F8, IRQ_UART2, STD_COM_FLAGS }, /* ttyS1 */ \ + { 0, BASE_BAUD, 0 , 0 , STD_COM_FLAGS }, /* ttyS2 */ \ + { 0, BASE_BAUD, 0 , 0 , STD_COM_FLAGS }, /* ttyS3 */ \ + { 0, BASE_BAUD, 0 , 0 , STD_COM_FLAGS }, /* ttyS4 */ \ + { 0, BASE_BAUD, 0 , 0 , STD_COM_FLAGS }, /* ttyS5 */ \ + { 0, BASE_BAUD, 0 , 0 , STD_COM_FLAGS }, /* ttyS6 */ \ + { 0, BASE_BAUD, 0 , 0 , STD_COM_FLAGS }, /* ttyS7 */ \ + { 0, BASE_BAUD, 0 , 0 , STD_COM_FLAGS }, /* ttyS8 */ \ + { 0, BASE_BAUD, 0 , 0 , STD_COM_FLAGS }, /* ttyS9 */ \ + { 0, BASE_BAUD, 0 , 0 , STD_COM_FLAGS }, /* ttyS10 */ \ + { 0, BASE_BAUD, 0 , 0 , STD_COM_FLAGS }, /* ttyS11 */ \ + { 0, BASE_BAUD, 0 , 0 , STD_COM_FLAGS }, /* ttyS12 */ \ + { 0, BASE_BAUD, 0 , 0 , STD_COM_FLAGS }, /* ttyS13 */ + +#endif diff --git a/include/asm-arm/arch-vnc/shmparam.h b/include/asm-arm/arch-vnc/shmparam.h new file mode 100644 index 000000000..9c36489cb --- /dev/null +++ b/include/asm-arm/arch-vnc/shmparam.h @@ -0,0 +1,5 @@ +/* + * linux/include/asm-arm/arch-ebsa110/shmparam.h + * + * Copyright (c) 1996 Russell King. + */ diff --git a/include/asm-arm/arch-vnc/system.h b/include/asm-arm/arch-vnc/system.h new file mode 100644 index 000000000..a3fed312c --- /dev/null +++ b/include/asm-arm/arch-vnc/system.h @@ -0,0 +1,24 @@ +/* + * linux/include/asm-arm/arch-ebsa285/system.h + * + * Copyright (c) 1996,1997,1998 Russell King. + */ +#include <asm/hardware.h> +#include <asm/leds.h> + +/* To reboot, we set up the 21285 watchdog and enable it. + * We then wait for it to timeout. + */ +extern __inline__ void arch_hard_reset (void) +{ + cli(); + *CSR_TIMER4_LOAD = 0x8000; + *CSR_TIMER4_CNTL = TIMER_CNTL_ENABLE | TIMER_CNTL_AUTORELOAD | TIMER_CNTL_DIV16; + *CSR_SA110_CNTL |= 1 << 13; + while(1); +} + +#define ARCH_IDLE_OK + +#define arch_start_idle() leds_event(led_idle_start) +#define arch_end_idle() leds_event(led_idle_end) diff --git a/include/asm-arm/arch-vnc/time.h b/include/asm-arm/arch-vnc/time.h new file mode 100644 index 000000000..73f228441 --- /dev/null +++ b/include/asm-arm/arch-vnc/time.h @@ -0,0 +1,40 @@ +/* + * linux/include/asm-arm/arch-vnc/time.h + * + * Copyright (c) 1997 Corel Computer Corp. + * Slight modifications to bring in line with ebsa285 port. + * -- Russell King. + */ + +extern __inline__ unsigned long gettimeoffset (void) +{ + return 0; +} + +extern __inline__ int reset_timer (void) +{ + *CSR_TIMER1_CLR = 0; + return 1; +} + +/* + * We don't have a RTC to update! + */ +#define update_rtc() + +/* + * Set up timer interrupt, and return the current time in seconds. + */ +extern __inline__ unsigned long setup_timer (void) +{ + *CSR_TIMER1_CLR = 1; + *CSR_TIMER1_LOAD = LATCH; + *CSR_TIMER1_CNTL = TIMER_CNTL_ENABLE | TIMER_CNTL_AUTORELOAD | TIMER_CNTL_DIV16; + + /* + * Default the date to 1 Jan 1970 00:00:00 + * You will have to run a time daemon to set the + * clock correctly at bootup + */ + return mktime(1970, 1, 1, 0, 0, 0); +} diff --git a/include/asm-arm/arch-vnc/timex.h b/include/asm-arm/arch-vnc/timex.h new file mode 100644 index 000000000..c50f118ff --- /dev/null +++ b/include/asm-arm/arch-vnc/timex.h @@ -0,0 +1,13 @@ +/* + * linux/include/asm-arm/arch-vnc/timex.h + * + * Corel Video NC architecture timex specifications + * + * Copyright (C) 1998 Corel Computer/Russell King + */ + +/* + * On the VNC, the clock runs at 66MHz and is divided + * by a 4-bit prescaler. + */ +#define CLOCK_TICK_RATE (66000000 / 16) diff --git a/include/asm-arm/arch-vnc/uncompress.h b/include/asm-arm/arch-vnc/uncompress.h new file mode 100644 index 000000000..d5260b027 --- /dev/null +++ b/include/asm-arm/arch-vnc/uncompress.h @@ -0,0 +1,33 @@ +/* + * linux/include/asm-arm/arch-ebsa110/uncompress.h + * + * Copyright (C) 1996,1997,1998 Russell King + */ + +/* + * This does not append a newline + */ +static void puts(const char *s) +{ + __asm__ __volatile__(" + ldrb %0, [%2], #1 + teq %0, #0 + beq 3f +1: strb %0, [%3] +2: ldrb %1, [%3, #0x14] + and %1, %1, #0x60 + teq %1, #0x60 + bne 2b + teq %0, #'\n' + moveq %0, #'\r' + beq 1b + ldrb %0, [%2], #1 + teq %0, #0 + bne 1b +3: " : : "r" (0), "r" (0), "r" (s), "r" (0xf0000be0) : "cc"); +} + +/* + * nothing to do + */ +#define arch_decomp_setup() diff --git a/include/asm-arm/bitops.h b/include/asm-arm/bitops.h index e6d942f71..5dcfe966f 100644 --- a/include/asm-arm/bitops.h +++ b/include/asm-arm/bitops.h @@ -55,6 +55,27 @@ extern __inline__ unsigned long ffz(unsigned long word) #ifdef __KERNEL__ +/* + * ffs: find first bit set. This is defined the same way as + * the libc and compiler builtin ffs routines, therefore + * differs in spirit from the above ffz (man ffs). + */ + +#define ffs(x) generic_ffs(x) + +/* + * hweightN: returns the hamming weight (i.e. the number + * of bits set) of a N-bit word + */ + +#define hweight32(x) generic_hweight32(x) +#define hweight16(x) generic_hweight16(x) +#define hweight8(x) generic_hweight8(x) + +#endif /* __KERNEL__ */ + +#ifdef __KERNEL__ + #define ext2_set_bit test_and_set_bit #define ext2_clear_bit test_and_clear_bit #define ext2_test_bit test_bit diff --git a/include/asm-arm/checksum.h b/include/asm-arm/checksum.h index ccfadd761..2323bb5d9 100644 --- a/include/asm-arm/checksum.h +++ b/include/asm-arm/checksum.h @@ -35,14 +35,19 @@ unsigned int csum_partial(const unsigned char * buff, int len, unsigned int sum) * better 64-bit) boundary */ -extern -unsigned int csum_partial_copy_from_user (const char *src, char *dst, int len, int sum, int *err_ptr); +unsigned int +csum_partial_copy_nocheck(const char *src, char *dst, int len, int sum); +unsigned int +csum_partial_copy_from_user(const char *src, char *dst, int len, int sum, int *err_ptr); + +#if 0 /* * This combination is currently not used, but possible: */ -extern -unsigned int csum_partial_copy_to_user (const char *src, char *dst, int len, int sum, int *err_ptr); +unsigned int +csum_partial_copy_to_user(const char *src, char *dst, int len, int sum, int *err_ptr); +#endif /* * These are the old (and unsafe) way of doing checksums, a warning message will be @@ -51,7 +56,8 @@ unsigned int csum_partial_copy_to_user (const char *src, char *dst, int len, int * these functions should go away after some time. */ #define csum_partial_copy_fromuser csum_partial_copy -unsigned int csum_partial_copy(const char *src, char *dst, int len, int sum); +unsigned int +csum_partial_copy(const char *src, char *dst, int len, int sum); /* * This is a version of ip_compute_csum() optimized for IP headers, @@ -62,8 +68,9 @@ unsigned int csum_partial_copy(const char *src, char *dst, int len, int sum); * Note: the order that the LDM registers are loaded with respect to * the adc's doesn't matter. */ -static inline unsigned short ip_fast_csum(unsigned char * iph, - unsigned int ihl) { +static inline unsigned short +ip_fast_csum(unsigned char * iph, unsigned int ihl) +{ unsigned int sum, tmp1; __asm__ __volatile__(" @@ -92,63 +99,64 @@ static inline unsigned short ip_fast_csum(unsigned char * iph, } /* - * computes the checksum of the TCP/UDP pseudo-header - * returns a 16-bit checksum, already complemented - */ -static inline unsigned short int csum_tcpudp_magic(unsigned long saddr, - unsigned long daddr, - unsigned short len, - unsigned short proto, - unsigned int sum) { - __asm__ __volatile__(" - adds %0, %0, %1 - adcs %0, %0, %4 - adcs %0, %0, %5 - adc %0, %0, #0 - adds %0, %0, %0, lsl #16 - addcs %0, %0, #0x10000 - mvn %0, %0 - mov %0, %0, lsr #16 - " - : "=&r" (sum), "=&r" (saddr) - : "0" (daddr), "1"(saddr), "r"((ntohs(len)<<16)+proto*256), "r"(sum)); - return((unsigned short)sum); -} - -/* * Fold a partial checksum without adding pseudo headers */ -static inline unsigned int csum_fold(unsigned int sum) +static inline unsigned int +csum_fold(unsigned int sum) { - __asm__ __volatile__(" - adds %0, %0, %0, lsl #16 - addcs %0, %0, #0x10000 - mvn %0, %0 - mov %0, %0, lsr #16 - " + __asm__(" + adds %0, %0, %0, lsl #16 + addcs %0, %0, #0x10000" : "=r" (sum) : "0" (sum)); + return (~sum) >> 16; +} + +static inline unsigned long +csum_tcpudp_nofold(unsigned long saddr, unsigned long daddr, unsigned short len, + unsigned short proto, unsigned int sum) +{ + __asm__(" + adds %0, %0, %1 + adcs %0, %0, %2 + adcs %0, %0, %3 + adc %0, %0, #0" + : "=&r"(sum) + : "r" (daddr), "r" (saddr), "r" ((ntohs(len)<<16)+proto*256), "0" (sum)); return sum; } - +/* + * computes the checksum of the TCP/UDP pseudo-header + * returns a 16-bit checksum, already complemented + */ +static inline unsigned short int +csum_tcpudp_magic(unsigned long saddr, unsigned long daddr, unsigned short len, + unsigned short proto, unsigned int sum) +{ + return csum_fold(csum_tcpudp_nofold(saddr, daddr, len, proto, sum)); +} + /* * this routine is used for miscellaneous IP-like checksums, mainly * in icmp.c */ +static inline unsigned short +ip_compute_csum(unsigned char * buff, int len) +{ + return csum_fold(csum_partial(buff, len, 0)); +} -static inline unsigned short ip_compute_csum(unsigned char * buff, int len) { - unsigned int sum; +#define _HAVE_ARCH_IPV6_CSUM +extern unsigned long +__csum_ipv6_magic(struct in6_addr *saddr, struct in6_addr *daddr, __u32 len, + __u32 proto, unsigned int sum); - __asm__ __volatile__(" - adds %0, %0, %0, lsl #16 - addcs %0, %0, #0x10000 - mvn %0, %0 - mov %0, %0, lsr #16 - " - : "=r"(sum) - : "0" (csum_partial(buff, len, 0))); - return(sum); +extern __inline__ unsigned short int +csum_ipv6_magic(struct in6_addr *saddr, struct in6_addr *daddr, __u16 len, + unsigned short proto, unsigned int sum) +{ + return csum_fold(__csum_ipv6_magic(saddr, daddr, htonl((__u32)len), + htonl(proto), sum)); } - #endif diff --git a/include/asm-arm/ecard.h b/include/asm-arm/ecard.h index fed84980d..afc4acc14 100644 --- a/include/asm-arm/ecard.h +++ b/include/asm-arm/ecard.h @@ -64,6 +64,8 @@ #define MANU_EESOX 0x0064 #define PROD_EESOX_SCSI2 0x008c +#define MANU_YELLOWSTONE 0x0096 +#define PROD_YELLOWSTONE_RAPIDE32 0x0120 #ifdef ECARD_C #define CONST diff --git a/include/asm-arm/elf.h b/include/asm-arm/elf.h index 139481831..8dd37e026 100644 --- a/include/asm-arm/elf.h +++ b/include/asm-arm/elf.h @@ -6,6 +6,7 @@ */ #include <asm/ptrace.h> +#include <asm/procinfo.h> typedef unsigned long elf_greg_t; @@ -39,16 +40,25 @@ typedef struct { void *null; } elf_fpregset_t; #define ELF_ET_DYN_BASE (2 * TASK_SIZE / 3) /* This yields a mask that user programs can use to figure out what - instruction set this cpu supports. This could be done in userspace, - but it's not easy, and we've already done it here. */ + instruction set this cpu supports. */ -#define ELF_HWCAP (0) +#define ELF_HWCAP (armidlist[armidindex].hwcap) /* This yields a string that ld.so will use to load implementation specific libraries for optimization. This is more specific in intent than poking at uname or /proc/cpuinfo. */ -#define ELF_PLATFORM (NULL) +/* For now we just provide a fairly general string that describes the + processor family. This could be made more specific later if someone + implemented optimisations that require it. 26-bit CPUs give you + "v1l" for ARM2 (no SWP) and "v2l" for anything else (ARM1 isn't + supported). 32-bit CPUs give you "v3[lb]" for anything based on an + ARM6 or ARM7 core and "armv4[lb]" for anything based on a StrongARM-1 + core. */ + +#define ELF_PLATFORM_SIZE 8 +extern char elf_platform[]; +#define ELF_PLATFORM (elf_platform) #ifdef __KERNEL__ #define SET_PERSONALITY(ex,ibcs2) \ diff --git a/include/asm-arm/fiq.h b/include/asm-arm/fiq.h new file mode 100644 index 000000000..2203fa2a5 --- /dev/null +++ b/include/asm-arm/fiq.h @@ -0,0 +1,32 @@ +/* Support for FIQ on ARM architectures. + * Written by Philip Blundell <philb@gnu.org>, 1998 + */ + +#ifndef __ASM_FIQ_H +#define __ASM_FIQ_H + +struct fiq_handler { + const char *name; + int (*callback)(void); +}; + +extern int claim_fiq(struct fiq_handler *f); +extern void release_fiq(struct fiq_handler *f); + +#endif +/* Support for FIQ on ARM architectures. + * Written by Philip Blundell <philb@gnu.org>, 1998 + */ + +#ifndef __ASM_FIQ_H +#define __ASM_FIQ_H + +struct fiq_handler { + const char *name; + int (*callback)(void); +}; + +extern int claim_fiq(struct fiq_handler *f); +extern void release_fiq(struct fiq_handler *f); + +#endif diff --git a/include/asm-arm/floppy.h b/include/asm-arm/floppy.h index e753d579b..865e54035 100644 --- a/include/asm-arm/floppy.h +++ b/include/asm-arm/floppy.h @@ -9,7 +9,14 @@ #include <asm/arch/floppy.h> #endif -#define fd_outb(val,port) outb((val),(port)) +#define fd_outb(val,port) \ + do { \ + if ((port) == FD_DOR) \ + fd_setdor((val)); \ + else \ + outb((val),(port)); \ + } while(0) + #define fd_inb(port) inb((port)) #define fd_request_irq() request_irq(IRQ_FLOPPYDISK,floppy_interrupt,\ SA_INTERRUPT|SA_SAMPLE_RANDOM,"floppy",NULL) @@ -26,6 +33,9 @@ #define fd_set_dma_addr(addr) set_dma_addr(FLOPPY_DMA, virt_to_bus((addr))) #define fd_set_dma_count(len) set_dma_count(FLOPPY_DMA, (len)) +/* need to clean up dma.h */ +#define DMA_FLOPPYDISK DMA_FLOPPY + /* Floppy_selects is the list of DOR's to select drive fd * * On initialisation, the floppy list is scanned, and the drives allocated @@ -39,13 +49,14 @@ static unsigned char floppy_selects[2][4] = { 0x10, 0x21, 0x23, 0x33 } }; -#define fd_setdor(dor) \ -do { \ - int new_dor = (dor); \ - if (new_dor & 0xf0) \ - fd_outb((new_dor & 0x0c) | floppy_selects[fdc][new_dor & 3], FD_DOR); \ - else \ - fd_outb((new_dor & 0x0c), FD_DOR); \ +#define fd_setdor(dor) \ +do { \ + int new_dor = (dor); \ + if (new_dor & 0xf0) \ + new_dor = (new_dor & 0x0c) | floppy_selects[fdc][new_dor & 3]; \ + else \ + new_dor &= 0x0c; \ + outb(new_dor, FD_DOR); \ } while (0) /* diff --git a/include/asm-arm/hardirq.h b/include/asm-arm/hardirq.h index bd25d1838..588c85894 100644 --- a/include/asm-arm/hardirq.h +++ b/include/asm-arm/hardirq.h @@ -5,6 +5,12 @@ extern unsigned int local_irq_count[NR_CPUS]; +/* + * Are we in an interrupt context? Either doing bottom half + * or hardware interrupt processing? + */ +#define in_interrupt() (local_irq_count[smp_processor_id()] + local_bh_count[smp_processor_id()] != 0) + #ifndef __SMP__ #define hardirq_trylock(cpu) (local_irq_count[cpu] == 0) diff --git a/include/asm-arm/init.h b/include/asm-arm/init.h index 7c1e47360..6105bbe88 100644 --- a/include/asm-arm/init.h +++ b/include/asm-arm/init.h @@ -1,24 +1,29 @@ #ifndef _ASMARM_INIT_H #define _ASMARM_INIT_H -#if 0 +#include <linux/config.h> + +/* C routines */ + +#ifdef CONFIG_BINUTILS_NEW + #define __init __attribute__ ((__section__ (".text.init"))) -#define __initdata __attribute__ ((__section__ (".data.init"))) #define __initfunc(__arginit) \ __arginit __init; \ __arginit -/* For assembly routines */ -#define __INIT .section ".text.init",@alloc,@execinstr -#define __FINIT .previous -#define __INITDATA .section ".data.init",@alloc,@write + #else + #define __init -#define __initdata #define __initfunc(__arginit) __arginit -/* For assembly routines */ -#define __INIT -#define __FINIT -#define __INITDATA + #endif +#define __initdata __attribute__ ((__section__ (".data.init"))) + +/* Assembly routines */ +#define __INIT .section ".text.init",@alloc,@execinstr +#define __INITDATA .section ".data.init",@alloc,@write +#define __FINIT .previous + #endif diff --git a/include/asm-arm/io.h b/include/asm-arm/io.h index 2451663e3..09713cda9 100644 --- a/include/asm-arm/io.h +++ b/include/asm-arm/io.h @@ -170,44 +170,20 @@ __IO(l,"",long) #undef ARCH_IO_DELAY #undef ARCH_IO_CONSTANT +#ifdef __KERNEL__ + /* - * Leftovers... + * String version of IO memory access ops: */ -#if 0 -#define __outwc(value,port) \ -({ \ - if (port < 256) \ - __asm__ __volatile__( \ - "strh %0, [%1, %2]" \ - : : "r" (value), "r" (PCIO_BASE), "J" (port << 2)); \ - else if (__PORT_PCIO(port)) \ - __asm__ __volatile__( \ - "strh %0, [%1, %2]" \ - : : "r" (value), "r" (PCIO_BASE), "r" (port << 2)); \ - else \ - __asm__ __volatile__( \ - "strh %0, [%1, %2]" \ - : : "r" (value), "r" (IO_BASE), "r" (port << 2)); \ -}) - -#define __inwc(port) \ -({ \ - unsigned short result; \ - if (port < 256) \ - __asm__ __volatile__( \ - "ldrh %0, [%1, %2]" \ - : "=r" (result) : "r" (PCIO_BASE), "J" (port << 2)); \ - else \ - if (__PORT_PCIO(port)) \ - __asm__ __volatile__( \ - "ldrh %0, [%1, %2]" \ - : "=r" (result) : "r" (PCIO_BASE), "r" (port << 2)); \ - else \ - __asm__ __volatile__( \ - "ldrh %0, [%1, %2]" \ - : "=r" (result) : "r" (IO_BASE), "r" (port << 2)); \ - result; \ -}) +extern void _memcpy_fromio(void *, unsigned long, unsigned long); +extern void _memcpy_toio(unsigned long, void *, unsigned long); +extern void _memset_io(unsigned long, int, unsigned long); + +#define memcpy_fromio(to,from,len) _memcpy_fromio((to),(unsigned long)(from),(len)) +#define memcpy_toio(to,from,len) _memcpy_toio((unsigned long)(to),(from),(len)) +#define memset_io(addr,c,len) _memset_io((unsigned long)(addr),(c),(len)) + #endif + #endif diff --git a/include/asm-arm/ioctl.h b/include/asm-arm/ioctl.h index a45e2fadc..2cbb7d0e9 100644 --- a/include/asm-arm/ioctl.h +++ b/include/asm-arm/ioctl.h @@ -1,5 +1,4 @@ -/* $Id: ioctl.h,v 1.5 1993/07/19 21:53:50 root Exp root $ - * +/* * linux/ioctl.h for Linux by H.H. Bergman. */ diff --git a/include/asm-arm/linux_logo.h b/include/asm-arm/linux_logo.h new file mode 100644 index 000000000..b10646254 --- /dev/null +++ b/include/asm-arm/linux_logo.h @@ -0,0 +1,27 @@ +/* + * linux/include/asm-arm/linux_logo.h + * + * Copyright (C) 1998 Russell King + * + * Linux console driver logo definitions for ARM + */ + +#include <linux/init.h> +#include <linux/version.h> + +#define linux_logo_banner "ARM Linux version " UTS_RELEASE + +#define LINUX_LOGO_COLORS 0 + +unsigned char linux_logo_red[] __initdata = { }; +unsigned char linux_logo_green[] __initdata = { }; +unsigned char linux_logo_blue[] __initdata = { }; + +unsigned char linux_logo16_red[] __initdata = { }; +unsigned char linux_logo16_green[] __initdata = { }; +unsigned char linux_logo16_blue[] __initdata = { }; + +unsigned char linux_logo[] __initdata = { }; +unsigned char linux_logo16[] __initdata = { }; +unsigned char linux_logo_bw[] __initdata = { }; + diff --git a/include/asm-arm/namei.h b/include/asm-arm/namei.h index 5270c3bdc..8fcd2f5cd 100644 --- a/include/asm-arm/namei.h +++ b/include/asm-arm/namei.h @@ -1,4 +1,4 @@ -/* $Id: namei.h,v 1.1 1996/12/13 14:48:21 jj Exp $ +/* * linux/include/asm-i386/namei.h * * Included from linux/fs/namei.c diff --git a/include/asm-arm/page.h b/include/asm-arm/page.h index 9a4429eb9..810aa479e 100644 --- a/include/asm-arm/page.h +++ b/include/asm-arm/page.h @@ -6,6 +6,8 @@ #ifdef __KERNEL__ +#define get_user_page(vaddr) __get_free_page(GFP_KERNEL) +#define free_user_page(page, addr) free_page(addr) #define clear_page(page) memzero((void *)(page), PAGE_SIZE) #define copy_page(to,from) memcpy((void *)(to), (void *)(from), PAGE_SIZE) diff --git a/include/asm-arm/pgtable.h b/include/asm-arm/pgtable.h index 4f9e5ba4a..c447459a0 100644 --- a/include/asm-arm/pgtable.h +++ b/include/asm-arm/pgtable.h @@ -7,4 +7,6 @@ #define module_map vmalloc #define module_unmap vfree +extern int do_check_pgt_cache(int, int); + #endif /* _ASMARM_PGTABLE_H */ diff --git a/include/asm-arm/posix_types.h b/include/asm-arm/posix_types.h index e32c78139..cff51a289 100644 --- a/include/asm-arm/posix_types.h +++ b/include/asm-arm/posix_types.h @@ -9,51 +9,61 @@ #ifndef __ARCH_ARM_POSIX_TYPES_H #define __ARCH_ARM_POSIX_TYPES_H +#include <linux/config.h> + /* * This file is generally used by user-level software, so you need to * be a little careful about namespace pollution etc. Also, we cannot * assume GCC is being used. */ -typedef unsigned short __kernel_dev_t; -typedef unsigned long __kernel_ino_t; -typedef unsigned short __kernel_mode_t; -typedef unsigned short __kernel_nlink_t; -typedef long __kernel_off_t; -typedef int __kernel_pid_t; -typedef unsigned short __kernel_ipc_pid_t; -typedef unsigned short __kernel_uid_t; -typedef unsigned short __kernel_gid_t; -typedef unsigned int __kernel_size_t; -typedef int __kernel_ssize_t; -typedef int __kernel_ptrdiff_t; -typedef long __kernel_time_t; -typedef long __kernel_suseconds_t; -typedef long __kernel_clock_t; -typedef int __kernel_daddr_t; -typedef char * __kernel_caddr_t; +typedef unsigned short __kernel_dev_t; +typedef unsigned long __kernel_ino_t; +typedef unsigned short __kernel_mode_t; +typedef unsigned short __kernel_nlink_t; +typedef long __kernel_off_t; +typedef int __kernel_pid_t; +typedef unsigned short __kernel_ipc_pid_t; +typedef unsigned short __kernel_uid_t; +typedef unsigned short __kernel_gid_t; +#ifdef CONFIG_BINUTILS_NEW +typedef long unsigned int __kernel_size_t; +#else +typedef unsigned int __kernel_size_t; +#endif +typedef int __kernel_ssize_t; +typedef int __kernel_ptrdiff_t; +typedef long __kernel_time_t; +typedef long __kernel_suseconds_t; +typedef long __kernel_clock_t; +typedef int __kernel_daddr_t; +typedef char * __kernel_caddr_t; #ifdef __GNUC__ -typedef long long __kernel_loff_t; +typedef long long __kernel_loff_t; #endif typedef struct { +#if defined(__KERNEL__) || defined(__USE_ALL) int val[2]; +#else /* !defined(__KERNEL__) && !defined(__USE_ALL) */ + int __val[2]; +#endif /* !defined(__KERNEL__) && !defined(__USE_ALL) */ } __kernel_fsid_t; -#undef __FD_SET +#undef __FD_SET #define __FD_SET(fd, fdsetp) \ (((fd_set *)fdsetp)->fds_bits[fd >> 5] |= (1<<(fd & 31))) -#undef __FD_CLR +#undef __FD_CLR #define __FD_CLR(fd, fdsetp) \ (((fd_set *)fdsetp)->fds_bits[fd >> 5] &= ~(1<<(fd & 31))) -#undef __FD_ISSET +#undef __FD_ISSET #define __FD_ISSET(fd, fdsetp) \ ((((fd_set *)fdsetp)->fds_bits[fd >> 5] & (1<<(fd & 31))) != 0) -#undef __FD_ZERO +#undef __FD_ZERO #define __FD_ZERO(fdsetp) \ (memset (fdsetp, 0, sizeof (*(fd_set *)fdsetp))) diff --git a/include/asm-arm/proc-armo/mm-init.h b/include/asm-arm/proc-armo/mm-init.h index 2cf40e9da..ba4db9e82 100644 --- a/include/asm-arm/proc-armo/mm-init.h +++ b/include/asm-arm/proc-armo/mm-init.h @@ -8,8 +8,8 @@ * some more work to get it to fit into our separate processor and * architecture structure. */ - -static unsigned long phys_screen_end; +extern unsigned long phys_screen_end; +extern unsigned long map_screen_mem(unsigned long log_start, unsigned long kmem, int update); int page_nr; #define setup_processor_functions() @@ -20,76 +20,6 @@ static inline void setup_swapper_dir (int index, pte_t *ptep) set_pmd (pmd_offset (swapper_pg_dir + index, 0), mk_pmd (ptep)); } -/* - * This routine needs more work to make it dynamically release/allocate mem! - */ -unsigned long map_screen_mem(unsigned long log_start, unsigned long kmem, int update) -{ - static int updated = 0; - - if (updated) - return 0; - - updated = update; - - if (update) { - unsigned long address = log_start, offset; - pgd_t *pgdp; - - kmem = (kmem + 3) & ~3; - - pgdp = pgd_offset (&init_mm, address); /* +31 */ - offset = SCREEN_START; - while (address < SCREEN1_END) { - unsigned long addr_pmd, end_pmd; - pmd_t *pmdp; - - /* if (pgd_none (*pgdp)) alloc pmd */ - pmdp = pmd_offset (pgdp, address); /* +0 */ - addr_pmd = address & ~PGDIR_MASK; /* 088000 */ - end_pmd = addr_pmd + SCREEN1_END - address; /* 100000 */ - if (end_pmd > PGDIR_SIZE) - end_pmd = PGDIR_SIZE; - - do { - unsigned long addr_pte, end_pte; - pte_t *ptep; - - if (pmd_none (*pmdp)) { - pte_t *new_pte = (pte_t *)kmem; - kmem += PTRS_PER_PTE * BYTES_PER_PTR; - memzero (new_pte, PTRS_PER_PTE * BYTES_PER_PTR); - set_pmd (pmdp, mk_pmd(new_pte)); - } - - ptep = pte_offset (pmdp, addr_pmd); /* +11 */ - addr_pte = addr_pmd & ~PMD_MASK; /* 088000 */ - end_pte = addr_pte + end_pmd - addr_pmd; /* 100000 */ - if (end_pte > PMD_SIZE) - end_pte = PMD_SIZE; - - do { - set_pte (ptep, mk_pte(offset, PAGE_KERNEL)); - addr_pte += PAGE_SIZE; - offset += PAGE_SIZE; - ptep++; - } while (addr_pte < end_pte); - - pmdp++; - addr_pmd = (addr_pmd + PMD_SIZE) & PMD_MASK; - } while (addr_pmd < end_pmd); - - address = (address + PGDIR_SIZE) & PGDIR_MASK; - pgdp ++; - } - - phys_screen_end = offset; - flush_tlb_all (); - update_mm_cache_all (); - } - return kmem; -} - static inline unsigned long setup_pagetables(unsigned long start_mem, unsigned long end_mem) { unsigned int i; diff --git a/include/asm-arm/proc-armo/page.h b/include/asm-arm/proc-armo/page.h index 058d7e9bd..0e2b4501c 100644 --- a/include/asm-arm/proc-armo/page.h +++ b/include/asm-arm/proc-armo/page.h @@ -7,8 +7,16 @@ #ifndef __ASM_PROC_PAGE_H #define __ASM_PROC_PAGE_H -/* PAGE_SHIFT determines the page size */ -#define PAGE_SHIFT 15 +#include <linux/config.h> + +/* PAGE_SHIFT determines the page size. This is configurable. */ +#if defined(CONFIG_PAGESIZE_8) +#define PAGE_SHIFT 13 /* 8K */ +#elif defined(CONFIG_PAGESIZE_16) +#define PAGE_SHIFT 14 /* 16K */ +#else /* default */ +#define PAGE_SHIFT 15 /* 32K */ +#endif #define PAGE_SIZE (1UL << PAGE_SHIFT) #define PAGE_MASK (~(PAGE_SIZE-1)) diff --git a/include/asm-arm/proc-armo/pgtable.h b/include/asm-arm/proc-armo/pgtable.h index 1f27878ef..ef732f784 100644 --- a/include/asm-arm/proc-armo/pgtable.h +++ b/include/asm-arm/proc-armo/pgtable.h @@ -41,7 +41,7 @@ /* * We have a mem map cache... */ -extern __inline__ void update_mm_cache_all(void) +extern __inline__ void update_memc_all(void) { struct task_struct *p; @@ -54,7 +54,7 @@ extern __inline__ void update_mm_cache_all(void) processor.u.armv2._remap_memc (current); } -extern __inline__ void update_mm_cache_task(struct task_struct *tsk) +extern __inline__ void update_memc_task(struct task_struct *tsk) { processor.u.armv2._update_map(tsk); @@ -62,7 +62,7 @@ extern __inline__ void update_mm_cache_task(struct task_struct *tsk) processor.u.armv2._remap_memc (tsk); } -extern __inline__ void update_mm_cache_mm(struct mm_struct *mm) +extern __inline__ void update_memc_mm(struct mm_struct *mm) { struct task_struct *p; @@ -77,7 +77,7 @@ extern __inline__ void update_mm_cache_mm(struct mm_struct *mm) processor.u.armv2._remap_memc (current); } -extern __inline__ void update_mm_cache_mm_addr(struct mm_struct *mm, unsigned long addr, pte_t pte) +extern __inline__ void update_memc_addr(struct mm_struct *mm, unsigned long addr, pte_t pte) { struct task_struct *p; @@ -117,7 +117,7 @@ extern __inline__ void update_mm_cache_mm_addr(struct mm_struct *mm, unsigned lo #define PTRS_PER_PTE 32 #define PTRS_PER_PMD 1 #define PTRS_PER_PGD 32 -#define USER_PTRS_PER_PGD (TASK_SIZE / PGDIR_SHIFT) +#define USER_PTRS_PER_PGD (TASK_SIZE/PGDIR_SIZE) /* Just any arbitrary offset to the start of the vmalloc VM area: the * current 8MB value just means that there will be a 8MB "hole" after the @@ -407,7 +407,8 @@ extern __inline__ void free_pmd_slow(pmd_t *pmd) { } -extern void __bad_pte(pmd_t *pmd); +extern void __bad_pmd(pmd_t *pmd); +extern void __bad_pmd_kernel(pmd_t *pmd); #define pte_free_kernel(pte) free_pte_fast(pte) #define pte_free(pte) free_pte_fast(pte) @@ -427,7 +428,7 @@ extern __inline__ pte_t *pte_alloc(pmd_t * pmd, unsigned long address) return page + address; } if (pmd_bad (*pmd)) { - __bad_pte(pmd); + __bad_pmd(pmd); return NULL; } return (pte_t *) pmd_page(*pmd) + address; @@ -463,7 +464,7 @@ extern __inline__ void set_pgdir(unsigned long address, pgd_t entry) } read_unlock(&tasklist_lock); for (pgd = (pgd_t *)pgd_quicklist; pgd; pgd = (pgd_t *)*(unsigned long *)pgd) - pgd[address >> PGDIR_SHIFT)] = entry; + pgd[address >> PGDIR_SHIFT] = entry; } extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; diff --git a/include/asm-arm/proc-armo/uaccess.h b/include/asm-arm/proc-armo/uaccess.h index 8d5745aed..1a6b950ed 100644 --- a/include/asm-arm/proc-armo/uaccess.h +++ b/include/asm-arm/proc-armo/uaccess.h @@ -33,7 +33,7 @@ extern __inline__ void set_fs (mm_segment_t fs) #define __range_ok(addr,size) ({ \ unsigned long flag, sum; \ - __asm__ __volatile__("adds %1, %2, %3; cmpls %1, %0; movls %0, #0" \ + __asm__ __volatile__("subs %1, %0, %3; cmpcs %1, %2; movcs %0, #0" \ : "=&r" (flag), "=&r" (sum) \ : "r" (addr), "Ir" (size), "0" (current->addr_limit) \ : "cc"); \ diff --git a/include/asm-arm/proc-armv/mm-init.h b/include/asm-arm/proc-armv/mm-init.h index 287779258..2e861b213 100644 --- a/include/asm-arm/proc-armv/mm-init.h +++ b/include/asm-arm/proc-armv/mm-init.h @@ -48,12 +48,13 @@ static inline void alloc_init_section(unsigned long *mem, unsigned long virt, unsigned long phys, int domain, int prot) { pgd_t *pgdp; - pmd_t *pmdp; + pmd_t *pmdp, pmd; pgdp = pgd_offset_k(virt); pmdp = pmd_offset(pgdp, virt); - pmd_val(*pmdp) = phys | PMD_TYPE_SECT | PMD_DOMAIN(domain) | prot; + pmd_val(pmd) = phys | PMD_TYPE_SECT | PMD_DOMAIN(domain) | prot; + set_pmd(pmdp, pmd); } /* @@ -78,7 +79,7 @@ static inline void alloc_init_page(unsigned long *mem, unsigned long virt, unsigned long phys, int domain, int prot) { pgd_t *pgdp; - pmd_t *pmdp; + pmd_t *pmdp, pmd; pte_t *ptep; pgdp = pgd_offset_k(virt); @@ -92,7 +93,8 @@ alloc_init_page(unsigned long *mem, unsigned long virt, unsigned long phys, int ptep = (pte_t *)memory; memzero(ptep, PTE_SIZE); - pmd_val(*pmdp) = __virt_to_phys(memory) | PMD_TYPE_TABLE | PMD_DOMAIN(domain); + pmd_val(pmd) = __virt_to_phys(memory) | PMD_TYPE_TABLE | PMD_DOMAIN(domain); + set_pmd(pmdp, pmd); *mem = memory + PTE_SIZE; } diff --git a/include/asm-arm/proc-armv/pgtable.h b/include/asm-arm/proc-armv/pgtable.h index 288e4043a..60b670fc2 100644 --- a/include/asm-arm/proc-armv/pgtable.h +++ b/include/asm-arm/proc-armv/pgtable.h @@ -45,12 +45,12 @@ processor.u.armv3v4._flush_icache_area((_start), (_end)) /* - * We don't have a mem map cache... + * We don't have a MEMC chip... */ -#define update_mm_cache_all() do { } while (0) -#define update_mm_cache_task(tsk) do { } while (0) -#define update_mm_cache_mm(mm) do { } while (0) -#define update_mm_cache_mm_addr(mm,addr,pte) do { } while (0) +#define update_memc_all() do { } while (0) +#define update_memc_task(tsk) do { } while (0) +#define update_memc_mm(mm) do { } while (0) +#define update_memc_addr(mm,addr,pte) do { } while (0) /* * This flushes back any buffered write data. We have to clean and flush the entries @@ -133,7 +133,7 @@ #define PTRS_PER_PTE 256 #define PTRS_PER_PMD 1 #define PTRS_PER_PGD 4096 -#define USER_PTRS_PER_PGD (TASK_SIZE / PGDIR_SIZE) +#define USER_PTRS_PER_PGD (TASK_SIZE/PGDIR_SIZE) /* Just any arbitrary offset to the start of the vmalloc VM area: the * current 8MB value just means that there will be a 8MB "hole" after the @@ -178,23 +178,22 @@ /* * We define the bits in the page tables as follows: - * PTE_BUFFERABLE page is writable - * PTE_AP_WRITE page is dirty + * PTE_BUFFERABLE page is dirty + * PTE_AP_WRITE page is writable * PTE_AP_READ page is a young (unsetting this causes faults for any access) + * PTE_CACHEABLE page is readable * - * Any page that is mapped in is assumed to be readable... + * A page will not be made writable without the dirty bit set. + * It is not legal to have a writable non-dirty page though (it breaks). + * + * A readable page is marked as being cacheable. + * Youngness is indicated by hardware read. If the page is old, + * then we will fault and make the page young again. */ -#if 0 #define _PTE_YOUNG PTE_AP_READ -#define _PTE_DIRTY PTE_AP_WRITE -#define _PTE_READ PTE_CACHEABLE -#define _PTE_WRITE PTE_BUFFERABLE -#else -#define _PTE_YOUNG PTE_CACHEABLE #define _PTE_DIRTY PTE_BUFFERABLE -#define _PTE_READ PTE_AP_READ +#define _PTE_READ PTE_CACHEABLE #define _PTE_WRITE PTE_AP_WRITE -#endif #define PAGE_NONE __pgprot(PTE_TYPE_SMALL | _PTE_YOUNG) #define PAGE_SHARED __pgprot(PTE_TYPE_SMALL | _PTE_YOUNG | _PTE_READ | _PTE_WRITE) @@ -351,7 +350,7 @@ extern __inline__ int pmd_present(pmd_t pmd) extern __inline__ int pte_write(pte_t pte) { - return pte_val(pte) & PTE_AP_WRITE; + return pte_val(pte) & _PTE_WRITE; } extern __inline__ int pte_dirty(pte_t pte) @@ -366,7 +365,7 @@ extern __inline__ int pte_young(pte_t pte) extern __inline__ pte_t pte_wrprotect(pte_t pte) { - pte_val(pte) &= ~PTE_AP_WRITE; + pte_val(pte) &= ~_PTE_WRITE; return pte; } @@ -378,31 +377,31 @@ extern __inline__ pte_t pte_nocache(pte_t pte) extern __inline__ pte_t pte_mkclean(pte_t pte) { - pte_val(pte) &= ~PTE_BUFFERABLE; + pte_val(pte) &= ~_PTE_DIRTY; return pte; } extern __inline__ pte_t pte_mkold(pte_t pte) { - pte_val(pte) &= ~PTE_AP_READ; + pte_val(pte) &= ~_PTE_YOUNG; return pte; } extern __inline__ pte_t pte_mkwrite(pte_t pte) { - pte_val(pte) |= PTE_AP_WRITE; + pte_val(pte) |= _PTE_WRITE; return pte; } extern __inline__ pte_t pte_mkdirty(pte_t pte) { - pte_val(pte) |= PTE_BUFFERABLE; + pte_val(pte) |= _PTE_DIRTY; return pte; } extern __inline__ pte_t pte_mkyoung(pte_t pte) { - pte_val(pte) |= PTE_AP_READ; + pte_val(pte) |= _PTE_YOUNG; return pte; } @@ -671,7 +670,6 @@ extern __inline__ pmd_t *pmd_alloc(pgd_t *pgd, unsigned long address) #define pmd_free_kernel pmd_free #define pmd_alloc_kernel pmd_alloc -#if 0 extern __inline__ void set_pgdir(unsigned long address, pgd_t entry) { struct task_struct * p; @@ -687,7 +685,6 @@ extern __inline__ void set_pgdir(unsigned long address, pgd_t entry) for (pgd = (pgd_t *)pgd_quicklist; pgd; pgd = (pgd_t *)*(unsigned long *)pgd) pgd[address >> PGDIR_SHIFT] = entry; } -#endif extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; diff --git a/include/asm-arm/processor.h b/include/asm-arm/processor.h index a75d4a960..d12829171 100644 --- a/include/asm-arm/processor.h +++ b/include/asm-arm/processor.h @@ -42,9 +42,19 @@ struct thread_struct { \ EXTRA_THREAD_STRUCT_INIT \ } +/* Forward declaration, a strange C thing */ +struct mm_struct; + /* Free all resources held by a thread. */ extern void release_thread(struct task_struct *); +/* Copy and release all segment info associated with a VM */ +extern void copy_segments(int nr, struct task_struct *p, struct mm_struct * mm); +extern void release_segments(struct mm_struct * mm); + +#define copy_segments(nr, tsk, mm) do { } while (0) +#define release_segments(mm) do { } while (0) + #define init_task (init_task_union.task) #define init_stack (init_task_union.stack) diff --git a/include/asm-arm/procinfo.h b/include/asm-arm/procinfo.h index 0d8811624..a89b7509f 100644 --- a/include/asm-arm/procinfo.h +++ b/include/asm-arm/procinfo.h @@ -9,23 +9,25 @@ #include <asm/proc-fns.h> -#define F_MEMC (1<<0) -#define F_MMU (1<<1) -#define F_32BIT (1<<2) -#define F_CACHE (1<<3) -#define F_IOEB (1<<31) - #ifndef __ASSEMBLER__ +#define HWCAP_SWP (1 << 0) +#define HWCAP_HALF (1 << 1) + struct armversions { - unsigned long id; - unsigned long mask; - unsigned long features; - const char *manu; - const char *name; - const struct processor *proc; + const unsigned long id; /* Processor ID */ + const unsigned long mask; /* Processor ID mask */ + const char *manu; /* Manufacturer */ + const char *name; /* Processor name */ + const char *arch_vsn; /* Architecture version */ + const char *elf_vsn; /* ELF library version */ + const int hwcap; /* ELF HWCAP */ + const struct processor *proc; /* Processor-specific ASM */ }; +extern const struct armversions armidlist[]; +extern int armidindex; + #endif #endif diff --git a/include/asm-arm/siginfo.h b/include/asm-arm/siginfo.h index b987a12eb..bcec2810f 100644 --- a/include/asm-arm/siginfo.h +++ b/include/asm-arm/siginfo.h @@ -43,6 +43,7 @@ typedef struct siginfo { /* SIGCHLD */ struct { pid_t _pid; /* which child */ + uid_t _uid; /* sender's uid */ int _status; /* exit code */ clock_t _utime; clock_t _stime; diff --git a/include/asm-arm/signal.h b/include/asm-arm/signal.h index 6303537f6..d171f77bf 100644 --- a/include/asm-arm/signal.h +++ b/include/asm-arm/signal.h @@ -6,6 +6,7 @@ /* Avoid too many header ordering problems. */ struct siginfo; +#ifdef __KERNEL__ /* Most things should be clean enough to redefine this at will, if care is taken to make libc match. */ @@ -19,6 +20,14 @@ typedef struct { unsigned long sig[_NSIG_WORDS]; } sigset_t; +#else +/* Here we must cater to lics that poke about in kernel headers. */ + +#define NSIG 32 +typedef unsigned long sigset_t; + +#endif /* __KERNEL__ */ + #define SIGHUP 1 #define SIGINT 2 #define SIGQUIT 3 @@ -88,6 +97,15 @@ typedef struct { #define SA_RESTORER 0x04000000 +/* + * sigaltstack controls + */ +#define SS_ONSTACK 1 +#define SS_DISABLE 2 + +#define MINSIGSTKSZ 2048 +#define SIGSTKSZ 8192 + #ifdef __KERNEL__ /* diff --git a/include/asm-arm/smp.h b/include/asm-arm/smp.h index adcc91c05..9776bf66d 100644 --- a/include/asm-arm/smp.h +++ b/include/asm-arm/smp.h @@ -3,10 +3,6 @@ #ifdef __SMP__ #error SMP not supported -#else - -#define cpu_logical_map(cpu) (cpu) - #endif #endif diff --git a/include/asm-arm/smp_lock.h b/include/asm-arm/smp_lock.h deleted file mode 100644 index 2d024ed57..000000000 --- a/include/asm-arm/smp_lock.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef __I386_SMPLOCK_H -#define __I386_SMPLOCK_H - -#define __STR(x) #x - -#ifndef __SMP__ - -#define lock_kernel() do { } while(0) -#define unlock_kernel() do { } while(0) -#define release_kernel_lock(task, cpu, depth) ((depth) = 1) -#define reacquire_kernel_lock(task, cpu, depth) do { } while(0) - -#else -#error SMP not supported -#endif /* __SMP__ */ - -#endif /* __I386_SMPLOCK_H */ diff --git a/include/asm-arm/smplock.h b/include/asm-arm/smplock.h new file mode 100644 index 000000000..e62326a10 --- /dev/null +++ b/include/asm-arm/smplock.h @@ -0,0 +1,49 @@ +/* + * <asm/smplock.h> + * + * Default SMP lock implementation + */ +#include <linux/interrupt.h> +#include <asm/spinlock.h> + +extern spinlock_t kernel_flag; + +/* + * Release global kernel lock and global interrupt lock + */ +#define release_kernel_lock(task, cpu) \ +do { \ + if (task->lock_depth >= 0) \ + spin_unlock(&kernel_flag); \ + release_irqlock(cpu); \ + __sti(); \ +} while (0) + +/* + * Re-acquire the kernel lock + */ +#define reacquire_kernel_lock(task) \ +do { \ + if (task->lock_depth >= 0) \ + spin_lock(&kernel_flag); \ +} while (0) + + +/* + * Getting the big kernel lock. + * + * This cannot happen asynchronously, + * so we only need to worry about other + * CPU's. + */ +extern __inline__ void lock_kernel(void) +{ + if (!++current->lock_depth) + spin_lock(&kernel_flag); +} + +extern __inline__ void unlock_kernel(void) +{ + if (--current->lock_depth < 0) + spin_unlock(&kernel_flag); +} diff --git a/include/asm-arm/spinlock.h b/include/asm-arm/spinlock.h index 376179b96..a952afe52 100644 --- a/include/asm-arm/spinlock.h +++ b/include/asm-arm/spinlock.h @@ -18,7 +18,7 @@ typedef struct { } spinlock_t; #define spin_unlock_irq(lock) sti() #define spin_lock_irqsave(lock, flags) \ - do { save_flags(flags); cli(); } while (0) + do { __save_flags_cli(flags); } while (0) #define spin_unlock_irqrestore(lock, flags) \ restore_flags(flags) @@ -45,11 +45,11 @@ typedef struct { } rwlock_t; #define write_unlock_irq(lock) sti() #define read_lock_irqsave(lock, flags) \ - do { save_flags(flags); cli(); } while (0) + do { __save_flags_cli(flags); } while (0) #define read_unlock_irqrestore(lock, flags) \ restore_flags(flags) #define write_lock_irqsave(lock, flags) \ - do { save_flags(flags); cli(); } while (0) + do { __save_flags_cli(flags); } while (0) #define write_unlock_irqrestore(lock, flags) \ restore_flags(flags) diff --git a/include/asm-arm/stat.h b/include/asm-arm/stat.h index 924fabca8..76c20e28f 100644 --- a/include/asm-arm/stat.h +++ b/include/asm-arm/stat.h @@ -38,40 +38,4 @@ struct stat { unsigned long __unused5; }; -typedef struct { - unsigned int minor; - unsigned int major; -} __new_dev_t; - -struct stat64 { - __new_dev_t st_dev; - __u64 st_ino; - unsigned int st_mode; - unsigned int st_nlink; - unsigned int st_uid; - unsigned int st_gid; - __new_dev_t st_rdev; - __s64 st_size; - __u64 st_blocks; - unsigned long st_atime; - unsigned long __unused1; - unsigned long st_mtime; - unsigned long __unused2; - unsigned long st_ctime; - unsigned long __unused3; - unsigned long st_blksize; - unsigned long __unused4; -}; - -#define __XSTAT_VER_1 1 -#define __XSTAT_VER_2 2 -#define __XSTAT_VER_MASK 0xff - -#define __XSTAT_VER_XSTAT 0x000 -#define __XSTAT_VER_LXSTAT 0x100 -#define __XSTAT_VER_FXSTAT 0x200 -#define __XSTAT_VER_TYPEMASK 0xff00 - -#define __XMKNOD_VER_1 1 - #endif diff --git a/include/asm-arm/system.h b/include/asm-arm/system.h index 2ad6a16cd..88148d4cd 100644 --- a/include/asm-arm/system.h +++ b/include/asm-arm/system.h @@ -29,5 +29,7 @@ extern void arm_invalidptr(const char *, int); #define mb() __asm__ __volatile__ ("" : : : "memory") #define nop() __asm__ __volatile__("mov r0,r0\n\t"); +extern asmlinkage void __backtrace(void); + #endif diff --git a/include/asm-generic/bitops.h b/include/asm-generic/bitops.h index 130619840..0ae108653 100644 --- a/include/asm-generic/bitops.h +++ b/include/asm-generic/bitops.h @@ -50,4 +50,26 @@ extern __inline__ int test_bit(int nr, int * addr) mask = 1 << (nr & 0x1f); return ((mask & *addr) != 0); } + +#ifdef __KERNEL__ + +/* + * ffs: find first bit set. This is defined the same way as + * the libc and compiler builtin ffs routines, therefore + * differs in spirit from the above ffz (man ffs). + */ + +#define ffs(x) generic_ffs(x) + +/* + * hweightN: returns the hamming weight (i.e. the number + * of bits set) of a N-bit word + */ + +#define hweight32(x) generic_hweight32(x) +#define hweight16(x) generic_hweight16(x) +#define hweight8(x) generic_hweight8(x) + +#endif /* __KERNEL__ */ + #endif /* _ASM_GENERIC_BITOPS_H */ diff --git a/include/asm-generic/smplock.h b/include/asm-generic/smplock.h new file mode 100644 index 000000000..e62326a10 --- /dev/null +++ b/include/asm-generic/smplock.h @@ -0,0 +1,49 @@ +/* + * <asm/smplock.h> + * + * Default SMP lock implementation + */ +#include <linux/interrupt.h> +#include <asm/spinlock.h> + +extern spinlock_t kernel_flag; + +/* + * Release global kernel lock and global interrupt lock + */ +#define release_kernel_lock(task, cpu) \ +do { \ + if (task->lock_depth >= 0) \ + spin_unlock(&kernel_flag); \ + release_irqlock(cpu); \ + __sti(); \ +} while (0) + +/* + * Re-acquire the kernel lock + */ +#define reacquire_kernel_lock(task) \ +do { \ + if (task->lock_depth >= 0) \ + spin_lock(&kernel_flag); \ +} while (0) + + +/* + * Getting the big kernel lock. + * + * This cannot happen asynchronously, + * so we only need to worry about other + * CPU's. + */ +extern __inline__ void lock_kernel(void) +{ + if (!++current->lock_depth) + spin_lock(&kernel_flag); +} + +extern __inline__ void unlock_kernel(void) +{ + if (--current->lock_depth < 0) + spin_unlock(&kernel_flag); +} diff --git a/include/asm-i386/bitops.h b/include/asm-i386/bitops.h index 3b31d4f57..00dd9dcc8 100644 --- a/include/asm-i386/bitops.h +++ b/include/asm-i386/bitops.h @@ -189,6 +189,36 @@ extern __inline__ unsigned long ffz(unsigned long word) #ifdef __KERNEL__ +/* + * ffs: find first bit set. This is defined the same way as + * the libc and compiler builtin ffs routines, therefore + * differs in spirit from the above ffz (man ffs). + */ + +extern __inline__ int ffs(int x) +{ + int r; + + __asm__("bsfl %1,%0\n\t" + "jnz 1f\n\t" + "movl $-1,%0\n" + "1:" : "=r" (r) : "g" (x)); + return r+1; +} + +/* + * hweightN: returns the hamming weight (i.e. the number + * of bits set) of a N-bit word + */ + +#define hweight32(x) generic_hweight32(x) +#define hweight16(x) generic_hweight16(x) +#define hweight8(x) generic_hweight8(x) + +#endif /* __KERNEL__ */ + +#ifdef __KERNEL__ + #define ext2_set_bit test_and_set_bit #define ext2_clear_bit test_and_clear_bit #define ext2_test_bit test_bit diff --git a/include/asm-i386/bugs.h b/include/asm-i386/bugs.h index af144354f..ba3a969ae 100644 --- a/include/asm-i386/bugs.h +++ b/include/asm-i386/bugs.h @@ -2,6 +2,11 @@ * include/asm-i386/bugs.h * * Copyright (C) 1994 Linus Torvalds + * + * Cyrix stuff, June 1998 by: + * - Rafael R. Reilova (moved everything from head.S), + * - Channing Corn (tests & fixes), + * - Andrew D. Balsa (code cleanup). */ /* @@ -14,10 +19,6 @@ #include <linux/config.h> #include <asm/processor.h> -#ifdef CONFIG_MTRR -# include <asm/mtrr.h> -#endif - #define CONFIG_BUGi386 __initfunc(static void no_halt(char *s, int *ints)) @@ -41,7 +42,7 @@ __initfunc(static void copro_timeout(void)) timer_table[COPRO_TIMER].expires = jiffies+100; timer_active |= 1<<COPRO_TIMER; printk(KERN_ERR "387 failed: trying to reset\n"); - send_sig(SIGFPE, last_task_used_math, 1); + send_sig(SIGFPE, current, 1); outb_p(0,0xf1); outb_p(0,0xf0); } @@ -83,7 +84,7 @@ __initfunc(static void check_fpu(void)) if (fpu_error) return; if (!ignore_irq13) { - printk("Ok, fpu using old IRQ13 error reporting\n"); + printk("OK, FPU using old IRQ 13 error reporting\n"); return; } __asm__("fninit\n\t" @@ -98,9 +99,9 @@ __initfunc(static void check_fpu(void)) : "=m" (*&boot_cpu_data.fdiv_bug) : "m" (*&x), "m" (*&y)); if (!boot_cpu_data.fdiv_bug) - printk("Ok, fpu using exception 16 error reporting.\n"); + printk("OK, FPU using exception 16 error reporting.\n"); else - printk("Hmm, fpu using exception 16 error reporting with FDIV bug.\n"); + printk("Hmm, FPU using exception 16 error reporting with FDIV bug.\n"); } __initfunc(static void check_hlt(void)) @@ -111,7 +112,7 @@ __initfunc(static void check_hlt(void)) return; } __asm__ __volatile__("hlt ; hlt ; hlt ; hlt"); - printk("Ok.\n"); + printk("OK.\n"); } __initfunc(static void check_tlb(void)) @@ -145,9 +146,9 @@ __initfunc(static void check_popad(void)) : "=eax" (res) : "edx" (inp) : "eax", "ecx", "edx", "edi" ); - /* If this fails, it means that any user program may lock CPU hard. Too bad. */ + /* If this fails, it means that any user program may lock the CPU hard. Too bad. */ if (res != 12345678) printk( "Buggy.\n" ); - else printk( "Ok.\n" ); + else printk( "OK.\n" ); #endif } @@ -156,7 +157,7 @@ __initfunc(static void check_popad(void)) * misexecution of code under Linux. Owners of such processors should * contact AMD for precise details and a CPU swap. * - * See http://www.chorus.com/~poulot/k6bug.html + * See http://www.mygale.com/~poulot/k6bug.html * http://www.amd.com/K6/k6docs/revgd.html * * The following test is erm.. interesting. AMD neglected to up @@ -202,7 +203,7 @@ __initfunc(static void check_amd_k6(void)) printk("system stability may be impaired when more than 32 MB are used.\n"); else printk("probably OK (after B9730xxxx).\n"); - printk(KERN_INFO "Please see http://www.chorus.com/poulot/k6bug.html\n"); + printk(KERN_INFO "Please see http://www.mygale.com/~poulot/k6bug.html\n"); } } @@ -226,13 +227,102 @@ __initfunc(static void check_pentium_f00f(void)) } } +/* + * Perform the Cyrix 5/2 test. A Cyrix won't change + * the flags, while other 486 chips will. + */ + +static inline int test_cyrix_52div(void) +{ + unsigned int test; + + __asm__ __volatile__( + "sahf\n\t" /* clear flags (%eax = 0x0005) */ + "div %b2\n\t" /* divide 5 by 2 */ + "lahf" /* store flags into %ah */ + : "=a" (test) + : "0" (5), "q" (2) + : "cc"); + + /* AH is 0x02 on Cyrix after the divide.. */ + return (unsigned char) (test >> 8) == 0x02; +} + +/* + * Cyrix CPUs without cpuid or with cpuid not yet enabled can be detected + * by the fact that they preserve the flags across the division of 5/2. + * PII and PPro exhibit this behavior too, but they have cpuid available. + */ + +__initfunc(static void check_cyrix_cpu(void)) +{ + if ((boot_cpu_data.cpuid_level == -1) && (boot_cpu_data.x86 == 4) + && test_cyrix_52div()) { + + /* default to an unknown Cx486, (we will differentiate later) */ + /* NOTE: using 0xff since 0x00 is a valid DIR0 value */ + strcpy(boot_cpu_data.x86_vendor_id, "CyrixInstead"); + boot_cpu_data.x86_model = 0xff; + boot_cpu_data.x86_mask = 0; + } +} + +/* + * Fix two problems with the Cyrix 6x86 and 6x86L: + * -- the cpuid is disabled on power up, enable it, use it. + * -- the SLOP bit needs resetting on some motherboards due to old BIOS, + * so that the udelay loop calibration works well. Recalibrate. + */ + +extern void calibrate_delay(void) __init; + +__initfunc(static void check_cx686_cpuid_slop(void)) +{ + if (boot_cpu_data.x86_vendor == X86_VENDOR_CYRIX && + (boot_cpu_data.x86_model & 0xf0) == 0x30) { /* 6x86(L) */ + int dummy; + unsigned char ccr3, ccr4, ccr5; + + cli(); + ccr3 = getCx86(CX86_CCR3); + setCx86(CX86_CCR3, (ccr3 & 0x0f) | 0x10); /* enable MAPEN */ + ccr4 = getCx86(CX86_CCR4); + setCx86(CX86_CCR4, ccr4 | 0x80); /* enable cpuid */ + ccr5 = getCx86(CX86_CCR5); + if (ccr5 & 2) /* reset SLOP if needed, old BIOS do this wrong */ + setCx86(CX86_CCR5, ccr5 & 0xfd); + setCx86(CX86_CCR3, ccr3); /* disable MAPEN */ + sti(); + + boot_cpu_data.cpuid_level = 1; /* should cover all 6x86(L) */ + boot_cpu_data.x86 = 5; + + /* we know we have level 1 available on the 6x86(L) */ + cpuid(1, &dummy, &dummy, &dummy, + &boot_cpu_data.x86_capability); + /* + * DON'T use the x86_mask and x86_model from cpuid, these are + * not as accurate (or the same) as those from the DIR regs. + * already in place after cyrix_model() in setup.c + */ + + if (ccr5 & 2) { /* possible wrong calibration done */ + printk(KERN_INFO "Recalibrating delay loop with SLOP bit reset\n"); + calibrate_delay(); + boot_cpu_data.loops_per_sec = loops_per_sec; + } + } +} + __initfunc(static void check_bugs(void)) { + check_cyrix_cpu(); identify_cpu(&boot_cpu_data); #ifndef __SMP__ printk("CPU: "); print_cpu_info(&boot_cpu_data); #endif + check_cx686_cpuid_slop(); check_tlb(); check_fpu(); check_hlt(); @@ -240,10 +330,4 @@ __initfunc(static void check_bugs(void)) check_amd_k6(); check_pentium_f00f(); system_utsname.machine[1] = '0' + boot_cpu_data.x86; -#if !defined(__SMP__) && defined(CONFIG_MTRR) - /* Must be done after other processors booted: at this point we are - called before SMP initialisation, so this is for the non-SMP case - only. The SMP case is handled in arch/i386/kernel/smp.c */ - mtrr_init (); -#endif } diff --git a/include/asm-i386/current.h b/include/asm-i386/current.h index 976320d75..bc1496a2c 100644 --- a/include/asm-i386/current.h +++ b/include/asm-i386/current.h @@ -1,14 +1,15 @@ #ifndef _I386_CURRENT_H #define _I386_CURRENT_H -static inline unsigned long get_esp(void) -{ - unsigned long esp; - __asm__("movl %%esp,%0":"=r" (esp)); - return esp; -} - -#define current ((struct task_struct *)(get_esp() & ~8191UL)) +struct task_struct; +static inline struct task_struct * get_current(void) +{ + struct task_struct *current; + __asm__("andl %%esp,%0; ":"=r" (current) : "0" (~8191UL)); + return current; + } + +#define current get_current() #endif /* !(_I386_CURRENT_H) */ diff --git a/include/linux/debugreg.h b/include/asm-i386/debugreg.h index d954a54ca..f0b2b06ae 100644 --- a/include/linux/debugreg.h +++ b/include/asm-i386/debugreg.h @@ -1,5 +1,5 @@ -#ifndef _LINUX_DEBUGREG_H -#define _LINUX_DEBUGREG_H +#ifndef _I386_DEBUGREG_H +#define _I386_DEBUGREG_H /* Indicate the register numbers for a number of the specific @@ -14,10 +14,13 @@ which debugging register was responsible for the trap. The other bits are either reserved or not of interest to us. */ -#define DR_TRAP0 (0x1) /* Trap due to db0 */ -#define DR_TRAP1 (0x2) /* Trap due to db1 */ -#define DR_TRAP2 (0x4) /* Trap due to db2 */ -#define DR_TRAP3 (0x8) /* Trap due to db3 */ +#define DR_TRAP0 (0x1) /* db0 */ +#define DR_TRAP1 (0x2) /* db1 */ +#define DR_TRAP2 (0x4) /* db2 */ +#define DR_TRAP3 (0x8) /* db3 */ + +#define DR_STEP (0x4000) /* single-step */ +#define DR_SWITCH (0x8000) /* task switch */ /* Now define a bunch of things for manipulating the control register. The top two bytes of the control register consist of 4 fields of 4 diff --git a/include/asm-i386/elf.h b/include/asm-i386/elf.h index 700bb8233..65a74c5cb 100644 --- a/include/asm-i386/elf.h +++ b/include/asm-i386/elf.h @@ -71,7 +71,7 @@ typedef struct user_i387_struct elf_fpregset_t; pr_reg[16] = regs->xss; /* This yields a mask that user programs can use to figure out what - instruction set this cpu supports. This could be done in userspace, + instruction set this CPU supports. This could be done in user space, but it's not easy, and we've already done it here. */ #define ELF_HWCAP (boot_cpu_data.x86_capability) diff --git a/include/asm-i386/fixmap.h b/include/asm-i386/fixmap.h new file mode 100644 index 000000000..c56966f64 --- /dev/null +++ b/include/asm-i386/fixmap.h @@ -0,0 +1,82 @@ +/* + * fixmap.h: compile-time virtual memory allocation + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 1998 Ingo Molnar + */ + +#ifndef _ASM_FIXMAP_H +#define _ASM_FIXMAP_H + +#include <asm/page.h> +#include <linux/kernel.h> + +/* + * Here we define all the compile-time 'special' virtual + * addresses. The point is to have a constant address at + * compile time, but to set the physical address only + * in the boot process. We allocate these special addresses + * from the end of virtual memory (0xfffff000) backwards. + * Also this lets us do fail-safe vmalloc(), we + * can guarantee that these special addresses and + * vmalloc()-ed addresses never overlap. + * + * these 'compile-time allocated' memory buffers are + * fixed-size 4k pages. (or larger if used with an increment + * bigger than 1) use fixmap_set(idx,phys) to associate + * physical memory with fixmap indices. + * + * TLB entries of such buffers will not be flushed across + * task switches. + */ + +/* + * on UP currently we will have no trace of the fixmap mechanizm, + * no page table allocations, etc. This might change in the + * future, say framebuffers for the console driver(s) could be + * fix-mapped? + */ +enum fixed_addresses { +#if __SMP__ + FIX_APIC_BASE, + FIX_IO_APIC_BASE, +#endif + __end_of_fixed_addresses +}; + +extern void set_fixmap (enum fixed_addresses idx, unsigned long phys); + +/* + * used by vmalloc.c. + * + * Leave one empty page between vmalloc'ed areas and + * the start of the fixmap, and leave one page empty + * at the top of mem.. + */ +#define FIXADDR_TOP (0xffffe000UL) +#define FIXADDR_SIZE (__end_of_fixed_addresses << PAGE_SHIFT) +#define FIXADDR_START (FIXADDR_TOP - FIXADDR_SIZE) + +/* + * 'index to address' translation. If anyone tries to use the idx + * directly without tranlation, we catch the bug with a NULL-deference + * kernel oops. Illegal ranges of incoming indices are caught too. + */ +extern inline unsigned long fix_to_virt(const unsigned int idx) +{ + /* + * this branch gets completely eliminated after inlining, + * except when someone tries to use fixaddr indices in an + * illegal way. (such as mixing up address types or using + * out-of-range indices) + */ + if (idx >= __end_of_fixed_addresses) + panic("illegal fixaddr index!"); + + return FIXADDR_TOP - (idx << PAGE_SHIFT); +} + +#endif diff --git a/include/asm-i386/hardirq.h b/include/asm-i386/hardirq.h index f679516bb..bfc535137 100644 --- a/include/asm-i386/hardirq.h +++ b/include/asm-i386/hardirq.h @@ -5,6 +5,13 @@ extern unsigned int local_irq_count[NR_CPUS]; +/* + * Are we in an interrupt context? Either doing bottom half + * or hardware interrupt processing? + */ +#define in_interrupt() ({ int __cpu = smp_processor_id(); \ + (local_irq_count[__cpu] + local_bh_count[__cpu] != 0); }) + #ifndef __SMP__ #define hardirq_trylock(cpu) (local_irq_count[cpu] == 0) diff --git a/include/asm-i386/ioctls.h b/include/asm-i386/ioctls.h index 1b8af73a4..9fc340a8a 100644 --- a/include/asm-i386/ioctls.h +++ b/include/asm-i386/ioctls.h @@ -65,6 +65,8 @@ #define TIOCMIWAIT 0x545C /* wait for a change on serial input line(s) */ #define TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */ +#define TIOCGHAYESESP 0x545E /* Get Hayes ESP configuration */ +#define TIOCSHAYESESP 0x545F /* Set Hayes ESP configuration */ /* Used for packet mode */ #define TIOCPKT_DATA 0 diff --git a/include/asm-i386/irq.h b/include/asm-i386/irq.h index 67b1a59e5..3d9a7c46c 100644 --- a/include/asm-i386/irq.h +++ b/include/asm-i386/irq.h @@ -10,14 +10,15 @@ * <tomsoft@informatik.tu-chemnitz.de> */ -#ifndef __SMP__ -#define NR_IRQS 16 -#else -#define NR_IRQS 24 -#endif - #define TIMER_IRQ 0 +/* + * 16 XT IRQ's, 8 potential APIC interrupt sources. + * Right now the APIC is only used for SMP, but this + * may change. + */ +#define NR_IRQS 64 + static __inline__ int irq_cannonicalize(int irq) { return ((irq == 2) ? 9 : irq); diff --git a/include/asm-i386/linux_logo.h b/include/asm-i386/linux_logo.h new file mode 100644 index 000000000..6773bef77 --- /dev/null +++ b/include/asm-i386/linux_logo.h @@ -0,0 +1,47 @@ +/* $Id: linux_logo.h,v 1.6 1998/07/07 13:34:56 jj Exp $ + * include/asm-i386/linux_logo.h: This is a linux logo + * to be displayed on boot. + * + * Copyright (C) 1996 Larry Ewing (lewing@isc.tamu.edu) + * Copyright (C) 1996 Jakub Jelinek (jj@sunsite.mff.cuni.cz) + * + * You can put anything here, but: + * LINUX_LOGO_COLORS has to be less than 224 + * image size has to be 80x80 + * values have to start from 0x20 + * (i.e. RGB(linux_logo_red[0], + * linux_logo_green[0], + * linux_logo_blue[0]) is color 0x20) + * BW image has to be 80x80 as well, with MS bit + * on the left + * Serial_console ascii image can be any size, + * but should contain %s to display the version + */ + +#include <linux/init.h> +#include <linux/version.h> + +#define linux_logo_banner "Linux/ia32 version " UTS_RELEASE + +#define LINUX_LOGO_COLORS 221 + +#ifdef INCLUDE_LINUX_LOGO_DATA + +#define INCLUDE_LINUX_LOGO16 + +#include <linux/linux_logo.h> + +#else + +/* prototypes only */ +extern unsigned char linux_logo_red[]; +extern unsigned char linux_logo_green[]; +extern unsigned char linux_logo_blue[]; +extern unsigned char linux_logo[]; +extern unsigned char linux_logo_bw[]; +extern unsigned char linux_logo16_red[]; +extern unsigned char linux_logo16_green[]; +extern unsigned char linux_logo16_blue[]; +extern unsigned char linux_logo16[]; + +#endif diff --git a/include/asm-i386/math_emu.h b/include/asm-i386/math_emu.h index 7284939fe..a5e7361e4 100644 --- a/include/asm-i386/math_emu.h +++ b/include/asm-i386/math_emu.h @@ -3,8 +3,8 @@ #include <asm/sigcontext.h> -void restore_i387_soft(void *s387, struct _fpstate *buf); -struct _fpstate * save_i387_soft(void *s387, struct _fpstate * buf); +int restore_i387_soft(void *s387, struct _fpstate *buf); +int save_i387_soft(void *s387, struct _fpstate * buf); /* This structure matches the layout of the data saved to the stack following a device-not-present interrupt, part of it saved diff --git a/include/asm-i386/md.h b/include/asm-i386/md.h new file mode 100644 index 000000000..0a2c5dd01 --- /dev/null +++ b/include/asm-i386/md.h @@ -0,0 +1,13 @@ +/* $Id: md.h,v 1.1 1997/12/15 15:11:57 jj Exp $ + * md.h: High speed xor_block operation for RAID4/5 + * + */ + +#ifndef __ASM_MD_H +#define __ASM_MD_H + +/* #define HAVE_ARCH_XORBLOCK */ + +#define MD_XORBLOCK_ALIGNMENT sizeof(long) + +#endif /* __ASM_MD_H */ diff --git a/include/asm-i386/pgtable.h b/include/asm-i386/pgtable.h index 47e1d2cfc..4a8e92c54 100644 --- a/include/asm-i386/pgtable.h +++ b/include/asm-i386/pgtable.h @@ -12,8 +12,11 @@ * This file contains the functions and defines necessary to modify and use * the i386 page table tree. */ - #ifndef __ASSEMBLY__ +#include <asm/processor.h> +#include <asm/fixmap.h> +#include <linux/tasks.h> + /* Caches aren't brain-dead on the intel. */ #define flush_cache_all() do { } while (0) #define flush_cache_mm(mm) do { } while (0) @@ -38,7 +41,7 @@ #define __flush_tlb() \ do { unsigned long tmpreg; __asm__ __volatile__("movl %%cr3,%0\n\tmovl %0,%%cr3":"=r" (tmpreg) : :"memory"); } while (0) -#if defined(CONFIG_M386) || defined(CONFIG_AMD_K5_INVBUG) +#ifdef CONFIG_M386 #define __flush_tlb_one(addr) flush_tlb() #else #define __flush_tlb_one(addr) \ @@ -97,7 +100,8 @@ static inline void flush_tlb_range(struct mm_struct *mm, static inline void flush_tlb_current_task(void) { - if (current->mm->count == 1) /* just one copy of this mm */ + /* just one copy of this mm? */ + if (atomic_read(¤t->mm->count) == 1) local_flush_tlb(); /* and that's us, so.. */ else smp_flush_tlb(); @@ -109,7 +113,7 @@ static inline void flush_tlb_current_task(void) static inline void flush_tlb_mm(struct mm_struct * mm) { - if (mm == current->mm && mm->count == 1) + if (mm == current->mm && atomic_read(&mm->count) == 1) local_flush_tlb(); else smp_flush_tlb(); @@ -118,7 +122,7 @@ static inline void flush_tlb_mm(struct mm_struct * mm) static inline void flush_tlb_page(struct vm_area_struct * vma, unsigned long va) { - if (vma->vm_mm == current->mm && current->mm->count == 1) + if (vma->vm_mm == current->mm && atomic_read(¤t->mm->count) == 1) __flush_tlb_one(va); else smp_flush_tlb(); @@ -159,7 +163,7 @@ static inline void flush_tlb_range(struct mm_struct *mm, #endif /* !__ASSEMBLY__ */ -/* Certain architectures need to do special things when pte's +/* Certain architectures need to do special things when PTEs * within a page table are directly modified. Thus, the following * hook is made available. */ @@ -182,6 +186,7 @@ static inline void flush_tlb_range(struct mm_struct *mm, #define PTRS_PER_PTE 1024 #define PTRS_PER_PMD 1 #define PTRS_PER_PGD 1024 +#define USER_PTRS_PER_PGD (TASK_SIZE/PGDIR_SIZE) /* * pgd entries used up by user/kernel: @@ -203,6 +208,7 @@ static inline void flush_tlb_range(struct mm_struct *mm, #define VMALLOC_OFFSET (8*1024*1024) #define VMALLOC_START (((unsigned long) high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)) #define VMALLOC_VMADDR(x) ((unsigned long)(x)) +#define VMALLOC_END (FIXADDR_START) /* * The 4MB page is guessing.. Detailed in the infamous "Chapter H" @@ -222,6 +228,9 @@ static inline void flush_tlb_range(struct mm_struct *mm, #define _PAGE_4M 0x080 /* 4 MB page, Pentium+.. */ #define _PAGE_GLOBAL 0x100 /* Global TLB entry PPro+ */ +#define _PAGE_READABLE (_PAGE_PRESENT) +#define _PAGE_WRITABLE (_PAGE_PRESENT | _PAGE_RW) + #define _PAGE_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED | _PAGE_DIRTY) #define _KERNPG_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY) #define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY) @@ -327,23 +336,27 @@ extern inline void pgd_clear(pgd_t * pgdp) { } * Undefined behaviour if not.. */ extern inline int pte_read(pte_t pte) { return pte_val(pte) & _PAGE_USER; } -extern inline int pte_write(pte_t pte) { return pte_val(pte) & _PAGE_RW; } extern inline int pte_exec(pte_t pte) { return pte_val(pte) & _PAGE_USER; } extern inline int pte_dirty(pte_t pte) { return pte_val(pte) & _PAGE_DIRTY; } extern inline int pte_young(pte_t pte) { return pte_val(pte) & _PAGE_ACCESSED; } -extern inline pte_t pte_wrprotect(pte_t pte) { pte_val(pte) &= ~_PAGE_RW; return pte; } extern inline pte_t pte_rdprotect(pte_t pte) { pte_val(pte) &= ~_PAGE_USER; return pte; } extern inline pte_t pte_exprotect(pte_t pte) { pte_val(pte) &= ~_PAGE_USER; return pte; } extern inline pte_t pte_mkclean(pte_t pte) { pte_val(pte) &= ~_PAGE_DIRTY; return pte; } extern inline pte_t pte_mkold(pte_t pte) { pte_val(pte) &= ~_PAGE_ACCESSED; return pte; } -extern inline pte_t pte_mkwrite(pte_t pte) { pte_val(pte) |= _PAGE_RW; return pte; } extern inline pte_t pte_mkread(pte_t pte) { pte_val(pte) |= _PAGE_USER; return pte; } extern inline pte_t pte_mkexec(pte_t pte) { pte_val(pte) |= _PAGE_USER; return pte; } extern inline pte_t pte_mkdirty(pte_t pte) { pte_val(pte) |= _PAGE_DIRTY; return pte; } extern inline pte_t pte_mkyoung(pte_t pte) { pte_val(pte) |= _PAGE_ACCESSED; return pte; } /* + * These are harder, as writability is two bits, not one.. + */ +extern inline int pte_write(pte_t pte) { return (pte_val(pte) & _PAGE_WRITABLE) == _PAGE_WRITABLE; } +extern inline pte_t pte_wrprotect(pte_t pte) { pte_val(pte) &= ~((pte_val(pte) & _PAGE_PRESENT) << 1); return pte; } +extern inline pte_t pte_mkwrite(pte_t pte) { pte_val(pte) |= _PAGE_RW; return pte; } + +/* * Conversion functions: convert a page and protection to a page entry, * and a page entry and page directory to the page they refer to. */ @@ -385,85 +398,137 @@ extern inline pmd_t * pmd_offset(pgd_t * dir, unsigned long address) * used to allocate a kernel page table - this turns on ASN bits * if any. */ -extern inline void pte_free_kernel(pte_t * pte) + +#define pgd_quicklist (current_cpu_data.pgd_quick) +#define pmd_quicklist ((unsigned long *)0) +#define pte_quicklist (current_cpu_data.pte_quick) +#define pgtable_cache_size (current_cpu_data.pgtable_cache_sz) + +extern __inline__ pgd_t *get_pgd_slow(void) { - free_page((unsigned long) pte); + pgd_t *ret = (pgd_t *)__get_free_page(GFP_KERNEL), *init; + + if (ret) { + init = pgd_offset(&init_mm, 0); + memset (ret, 0, USER_PTRS_PER_PGD * sizeof(pgd_t)); + memcpy (ret + USER_PTRS_PER_PGD, init + USER_PTRS_PER_PGD, + (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t)); + } + return ret; } -extern const char bad_pmd_string[]; +extern __inline__ pgd_t *get_pgd_fast(void) +{ + unsigned long *ret; + + if((ret = pgd_quicklist) != NULL) { + pgd_quicklist = (unsigned long *)(*ret); + ret[0] = ret[1]; + pgtable_cache_size--; + } else + ret = (unsigned long *)get_pgd_slow(); + return (pgd_t *)ret; +} -extern inline pte_t * pte_alloc_kernel(pmd_t * pmd, unsigned long address) +extern __inline__ void free_pgd_fast(pgd_t *pgd) { - address = (address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1); - if (pmd_none(*pmd)) { - pte_t * page = (pte_t *) get_free_page(GFP_KERNEL); - if (pmd_none(*pmd)) { - if (page) { - pmd_val(*pmd) = _KERNPG_TABLE + __pa(page); - return page + address; - } - pmd_val(*pmd) = _KERNPG_TABLE + __pa(BAD_PAGETABLE); - return NULL; - } - free_page((unsigned long) page); - } - if (pmd_bad(*pmd)) { - printk(bad_pmd_string, pmd_val(*pmd)); - pmd_val(*pmd) = _KERNPG_TABLE + __pa(BAD_PAGETABLE); - return NULL; + *(unsigned long *)pgd = (unsigned long) pgd_quicklist; + pgd_quicklist = (unsigned long *) pgd; + pgtable_cache_size++; +} + +extern __inline__ void free_pgd_slow(pgd_t *pgd) +{ + free_page((unsigned long)pgd); +} + +extern pte_t *get_pte_slow(pmd_t *pmd, unsigned long address_preadjusted); +extern pte_t *get_pte_kernel_slow(pmd_t *pmd, unsigned long address_preadjusted); + +extern __inline__ pte_t *get_pte_fast(void) +{ + unsigned long *ret; + + if((ret = (unsigned long *)pte_quicklist) != NULL) { + pte_quicklist = (unsigned long *)(*ret); + ret[0] = ret[1]; + pgtable_cache_size--; } - return (pte_t *) pmd_page(*pmd) + address; + return (pte_t *)ret; } -/* - * allocating and freeing a pmd is trivial: the 1-entry pmd is - * inside the pgd, so has no extra memory associated with it. - */ -extern inline void pmd_free_kernel(pmd_t * pmd) +extern __inline__ void free_pte_fast(pte_t *pte) { - pmd_val(*pmd) = 0; + *(unsigned long *)pte = (unsigned long) pte_quicklist; + pte_quicklist = (unsigned long *) pte; + pgtable_cache_size++; } -extern inline pmd_t * pmd_alloc_kernel(pgd_t * pgd, unsigned long address) +extern __inline__ void free_pte_slow(pte_t *pte) +{ + free_page((unsigned long)pte); +} + +/* We don't use pmd cache, so these are dummy routines */ +extern __inline__ pmd_t *get_pmd_fast(void) +{ + return (pmd_t *)0; +} + +extern __inline__ void free_pmd_fast(pmd_t *pmd) { - return (pmd_t *) pgd; } -extern inline void pte_free(pte_t * pte) +extern __inline__ void free_pmd_slow(pmd_t *pmd) { - free_page((unsigned long) pte); +} + +extern void __bad_pte(pmd_t *pmd); +extern void __bad_pte_kernel(pmd_t *pmd); + +#define pte_free_kernel(pte) free_pte_fast(pte) +#define pte_free(pte) free_pte_fast(pte) +#define pgd_free(pgd) free_pgd_fast(pgd) +#define pgd_alloc() get_pgd_fast() + +extern inline pte_t * pte_alloc_kernel(pmd_t * pmd, unsigned long address) +{ + address = (address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1); + if (pmd_none(*pmd)) { + pte_t * page = (pte_t *) get_pte_fast(); + + if (!page) + return get_pte_kernel_slow(pmd, address); + pmd_val(*pmd) = _KERNPG_TABLE + __pa(page); + return page + address; + } + if (pmd_bad(*pmd)) { + __bad_pte_kernel(pmd); + return NULL; + } + return (pte_t *) pmd_page(*pmd) + address; } extern inline pte_t * pte_alloc(pmd_t * pmd, unsigned long address) { address = (address >> (PAGE_SHIFT-2)) & 4*(PTRS_PER_PTE - 1); -repeat: if (pmd_none(*pmd)) goto getnew; if (pmd_bad(*pmd)) goto fix; return (pte_t *) (pmd_page(*pmd) + address); - getnew: { - unsigned long page = __get_free_page(GFP_KERNEL); - if (!pmd_none(*pmd)) - goto freenew; + unsigned long page = (unsigned long) get_pte_fast(); + if (!page) - goto oom; - memset((void *) page, 0, PAGE_SIZE); + return get_pte_slow(pmd, address); pmd_val(*pmd) = _PAGE_TABLE + __pa(page); return (pte_t *) (page + address); -freenew: - free_page(page); - goto repeat; } - fix: - printk(bad_pmd_string, pmd_val(*pmd)); -oom: - pmd_val(*pmd) = _PAGE_TABLE + __pa(BAD_PAGETABLE); + __bad_pte(pmd); return NULL; } @@ -473,7 +538,6 @@ oom: */ extern inline void pmd_free(pmd_t * pmd) { - pmd_val(*pmd) = 0; } extern inline pmd_t * pmd_alloc(pgd_t * pgd, unsigned long address) @@ -481,14 +545,36 @@ extern inline pmd_t * pmd_alloc(pgd_t * pgd, unsigned long address) return (pmd_t *) pgd; } -extern inline void pgd_free(pgd_t * pgd) -{ - free_page((unsigned long) pgd); -} +#define pmd_free_kernel pmd_free +#define pmd_alloc_kernel pmd_alloc -extern inline pgd_t * pgd_alloc(void) +extern int do_check_pgt_cache(int, int); + +extern inline void set_pgdir(unsigned long address, pgd_t entry) { - return (pgd_t *) get_free_page(GFP_KERNEL); + struct task_struct * p; + pgd_t *pgd; +#ifdef __SMP__ + int i; +#endif + + read_lock(&tasklist_lock); + for_each_task(p) { + if (!p->mm) + continue; + *pgd_offset(p->mm,address) = entry; + } + read_unlock(&tasklist_lock); +#ifndef __SMP__ + for (pgd = (pgd_t *)pgd_quicklist; pgd; pgd = (pgd_t *)*(unsigned long *)pgd) + pgd[address >> PGDIR_SHIFT] = entry; +#else + /* To pgd_alloc/pgd_free, one holds master kernel lock and so does our callee, so we can + modify pgd caches of other CPUs as well. -jj */ + for (i = 0; i < NR_CPUS; i++) + for (pgd = (pgd_t *)cpu_data[i].pgd_quick; pgd; pgd = (pgd_t *)*(unsigned long *)pgd) + pgd[address >> PGDIR_SHIFT] = entry; +#endif } extern pgd_t swapper_pg_dir[1024]; @@ -511,4 +597,7 @@ extern inline void update_mmu_cache(struct vm_area_struct * vma, #endif /* !__ASSEMBLY__ */ +/* Needs to be defined here and not in linux/mm.h, as it is arch dependent */ +#define PageSkip(page) (0) + #endif /* _I386_PAGE_H */ diff --git a/include/asm-i386/posix_types.h b/include/asm-i386/posix_types.h index aed0fd6fd..6413683c2 100644 --- a/include/asm-i386/posix_types.h +++ b/include/asm-i386/posix_types.h @@ -37,6 +37,8 @@ typedef struct { #endif /* !defined(__KERNEL__) && !defined(__USE_ALL) */ } __kernel_fsid_t; +#if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) + #undef __FD_SET #define __FD_SET(fd,fdsetp) \ __asm__ __volatile__("btsl %1,%0": \ @@ -62,4 +64,6 @@ typedef struct { :"a" (0), "c" (__FDSET_LONGS), \ "D" ((__kernel_fd_set *) (fdsetp)) :"cx","di") +#endif /* defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) */ + #endif diff --git a/include/asm-i386/processor.h b/include/asm-i386/processor.h index 14706b18a..7caccbdc0 100644 --- a/include/asm-i386/processor.h +++ b/include/asm-i386/processor.h @@ -34,6 +34,9 @@ struct cpuinfo_x86 { int fdiv_bug; int f00f_bug; unsigned long loops_per_sec; + unsigned long *pgd_quick; + unsigned long *pte_quick; + unsigned long pgtable_cache_sz; }; #define X86_VENDOR_INTEL 0 @@ -44,6 +47,43 @@ struct cpuinfo_x86 { #define X86_VENDOR_CENTAUR 5 #define X86_VENDOR_UNKNOWN 0xff +/* + * capabilities of CPUs + */ + +#define X86_FEATURE_FPU 0x00000001 /* onboard FPU */ +#define X86_FEATURE_VME 0x00000002 /* Virtual Mode Extensions */ +#define X86_FEATURE_DE 0x00000004 /* Debugging Extensions */ +#define X86_FEATURE_PSE 0x00000008 /* Page Size Extensions */ +#define X86_FEATURE_TSC 0x00000010 /* Time Stamp Counter */ +#define X86_FEATURE_MSR 0x00000020 /* Model-Specific Registers, RDMSR, WRMSR */ +#define X86_FEATURE_PAE 0x00000040 /* Physical Address Extensions */ +#define X86_FEATURE_MCE 0x00000080 /* Machine Check Exceptions */ +#define X86_FEATURE_CX8 0x00000100 /* CMPXCHG8 instruction */ +#define X86_FEATURE_APIC 0x00000200 /* onboard APIC */ +#define X86_FEATURE_10 0x00000400 +#define X86_FEATURE_SEP 0x00000800 /* Fast System Call */ +#define X86_FEATURE_MTRR 0x00001000 /* Memory Type Range Registers */ +#define X86_FEATURE_PGE 0x00002000 /* Page Global Enable */ +#define X86_FEATURE_MCA 0x00004000 /* Machine Check Architecture */ +#define X86_FEATURE_CMOV 0x00008000 /* CMOV instruction (FCMOVCC and FCOMI too if FPU present) */ +#define X86_FEATURE_PAT 0x00010000 /* Page Attribute Table */ +#define X86_FEATURE_PSE36 0x00020000 /* 36-bit PSEs */ +#define X86_FEATURE_18 0x00040000 +#define X86_FEATURE_19 0x00080000 +#define X86_FEATURE_20 0x00100000 +#define X86_FEATURE_21 0x00200000 +#define X86_FEATURE_22 0x00400000 +#define X86_FEATURE_MMX 0x00800000 /* multimedia extensions */ +#define X86_FEATURE_FXSR 0x01000000 /* FXSAVE and FXRSTOR instructions (fast save and restore of FPU context), and CR4.OSFXSR (OS uses these instructions) available */ +#define X86_FEATURE_25 0x02000000 +#define X86_FEATURE_26 0x04000000 +#define X86_FEATURE_27 0x08000000 +#define X86_FEATURE_28 0x10000000 +#define X86_FEATURE_29 0x20000000 +#define X86_FEATURE_30 0x40000000 +#define X86_FEATURE_AMD3D 0x80000000 + extern struct cpuinfo_x86 boot_cpu_data; #ifdef __SMP__ @@ -60,6 +100,41 @@ extern void identify_cpu(struct cpuinfo_x86 *); extern void print_cpu_info(struct cpuinfo_x86 *); /* + * Generic CPUID function + */ +extern inline void cpuid(int op, int *eax, int *ebx, int *ecx, int *edx) +{ + __asm__("cpuid" + : "=a" (*eax), + "=b" (*ebx), + "=c" (*ecx), + "=d" (*edx) + : "a" (op) + : "cc"); +} + +/* + * Cyrix CPU configuration register indexes + */ +#define CX86_CCR2 0xc2 +#define CX86_CCR3 0xc3 +#define CX86_CCR4 0xe8 +#define CX86_CCR5 0xe9 +#define CX86_DIR0 0xfe +#define CX86_DIR1 0xff + +/* + * Cyrix CPU indexed register access macros + */ + +#define getCx86(reg) ({ outb((reg), 0x22); inb(0x23); }) + +#define setCx86(reg, data) do { \ + outb((reg), 0x22); \ + outb((data), 0x23); \ +} while (0) + +/* * Bus types (default is ISA, but people can check others with these..) */ extern int EISA_bus; @@ -149,6 +224,8 @@ struct thread_struct { unsigned long tr; unsigned long cr2, trap_no, error_code; mm_segment_t segment; +/* debug registers */ + long debugreg[8]; /* Hardware debugging registers */ /* floating point info */ union i387_union i387; /* virtual 86 mode info */ @@ -160,33 +237,35 @@ struct thread_struct { #define INIT_MMAP \ { &init_mm, 0, 0, PAGE_SHARED, VM_READ | VM_WRITE | VM_EXEC, NULL, &init_mm.mmap } -#define INIT_TSS { \ - 0,0, \ - sizeof(init_stack) + (long) &init_stack, \ - __KERNEL_DS, 0, \ - 0,0,0,0,0,0, \ - (long) &swapper_pg_dir - PAGE_OFFSET, \ - 0,0,0,0,0,0,0,0,0,0, \ - __USER_DS,0,__USER_DS,0,__USER_DS,0, \ - __USER_DS,0,__USER_DS,0,__USER_DS,0, \ - _LDT(0),0, \ - 0, 0x8000, \ - {~0, }, /* ioperm */ \ - _TSS(0), 0, 0, 0, (mm_segment_t) { 0 } /* obsolete */ , \ - { { 0, }, }, /* 387 state */ \ - NULL, 0, 0, 0, 0, 0 /* vm86_info */, \ +#define INIT_TSS { \ + 0,0, /* back_link, __blh */ \ + sizeof(init_stack) + (long) &init_stack, /* esp0 */ \ + __KERNEL_DS, 0, /* ss0 */ \ + 0,0,0,0,0,0, /* stack1, stack2 */ \ + (long) &swapper_pg_dir - PAGE_OFFSET, /* cr3 */ \ + 0,0, /* eip,eflags */ \ + 0,0,0,0, /* eax,ecx,edx,ebx */ \ + 0,0,0,0, /* esp,ebp,esi,edi */ \ + 0,0,0,0,0,0, /* es,cs,ss */ \ + 0,0,0,0,0,0, /* ds,fs,gs */ \ + _LDT(0),0, /* ldt */ \ + 0, 0x8000, /* tace, bitmap */ \ + {~0, }, /* ioperm */ \ + _TSS(0), 0, 0, 0, (mm_segment_t) { 0 }, /* obsolete */ \ + { 0, }, \ + { { 0, }, }, /* 387 state */ \ + NULL, 0, 0, 0, 0, 0, /* vm86_info */ \ } -#define start_thread(regs, new_eip, new_esp) do {\ - unsigned long seg = __USER_DS; \ - __asm__("movl %w0,%%fs ; movl %w0,%%gs":"=r" (seg) :"0" (seg)); \ - set_fs(USER_DS); \ - regs->xds = seg; \ - regs->xes = seg; \ - regs->xss = seg; \ - regs->xcs = __USER_CS; \ - regs->eip = new_eip; \ - regs->esp = new_esp; \ +#define start_thread(regs, new_eip, new_esp) do { \ + __asm__("movl %w0,%%fs ; movl %w0,%%gs": :"r" (0)); \ + set_fs(USER_DS); \ + regs->xds = __USER_DS; \ + regs->xes = __USER_DS; \ + regs->xss = __USER_DS; \ + regs->xcs = __USER_CS; \ + regs->eip = new_eip; \ + regs->esp = new_esp; \ } while (0) /* Forward declaration, a strange C thing */ @@ -207,13 +286,8 @@ extern inline unsigned long thread_saved_pc(struct thread_struct *t) return ((unsigned long *)t->esp)[3]; } -/* Allocation and freeing of basic task resources. */ -/* - * NOTE! The task struct and the stack go together - */ -#define alloc_task_struct() \ - ((struct task_struct *) __get_free_pages(GFP_KERNEL,1)) -#define free_task_struct(p) free_pages((unsigned long)(p),1) +extern struct task_struct * alloc_task_struct(void); +extern void free_task_struct(struct task_struct *); #define init_task (init_task_union.task) #define init_stack (init_task_union.stack) diff --git a/include/asm-i386/siginfo.h b/include/asm-i386/siginfo.h index 99101420b..01ef4d08a 100644 --- a/include/asm-i386/siginfo.h +++ b/include/asm-i386/siginfo.h @@ -43,6 +43,7 @@ typedef struct siginfo { /* SIGCHLD */ struct { pid_t _pid; /* which child */ + uid_t _uid; /* sender's uid */ int _status; /* exit code */ clock_t _utime; clock_t _stime; diff --git a/include/asm-i386/signal.h b/include/asm-i386/signal.h index 598a21008..030a19b7b 100644 --- a/include/asm-i386/signal.h +++ b/include/asm-i386/signal.h @@ -72,7 +72,7 @@ typedef unsigned long sigset_t; /* * SA_FLAGS values: * - * SA_ONSTACK is not currently supported, but will allow sigaltstack(2). + * SA_ONSTACK indicates that a registered stack_t will be used. * SA_INTERRUPT is a no-op, but left due to historical reasons. Use the * SA_RESTART flag to get restarting signals (which were the default long ago) * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. @@ -97,6 +97,15 @@ typedef unsigned long sigset_t; #define SA_RESTORER 0x04000000 +/* + * sigaltstack controls + */ +#define SS_ONSTACK 1 +#define SS_DISABLE 2 + +#define MINSIGSTKSZ 2048 +#define SIGSTKSZ 8192 + #ifdef __KERNEL__ /* diff --git a/include/asm-i386/smp.h b/include/asm-i386/smp.h index 96c2d2764..33dbab5bf 100644 --- a/include/asm-i386/smp.h +++ b/include/asm-i386/smp.h @@ -6,6 +6,8 @@ #include <asm/i82489.h> #include <asm/bitops.h> +#include <asm/fixmap.h> + #include <linux/tasks.h> #include <linux/ptrace.h> @@ -160,11 +162,10 @@ extern unsigned long cpu_present_map; extern volatile int cpu_number_map[NR_CPUS]; extern volatile unsigned long smp_invalidate_needed; extern void smp_flush_tlb(void); -extern volatile unsigned long kernel_flag, kernel_counter; + extern volatile unsigned long cpu_callin_map[NR_CPUS]; -extern volatile unsigned char active_kernel_processor; extern void smp_message_irq(int cpl, void *dev_id, struct pt_regs *regs); -extern void smp_reschedule_irq(int cpl, struct pt_regs *regs); +extern void smp_send_reschedule(int cpu); extern unsigned long ipi_count; extern void smp_invalidate_rcv(void); /* Process an NMI */ extern void smp_local_timer_interrupt(struct pt_regs * regs); @@ -183,7 +184,8 @@ extern inline int cpu_logical_map(int cpu) extern void smp_callin(void); extern void smp_boot_cpus(void); -extern void smp_store_cpu_info(int id); /* Store per cpu info (like the initial udelay numbers */ +extern void smp_store_cpu_info(int id); /* Store per CPU info (like the initial udelay numbers */ +extern void smp_message_pass(int target, int msg, unsigned long data, int wait); extern volatile unsigned long smp_proc_in_lock[NR_CPUS]; /* for computing process time */ extern volatile int smp_process_available; @@ -195,7 +197,7 @@ extern volatile int smp_process_available; * "Back to Back Assertions of HOLD May Cause Lost APIC Write Cycle" */ -#define APIC_BASE ((char *)0xFEE00000) +#define APIC_BASE (fix_to_virt(FIX_APIC_BASE)) extern __inline void apic_write(unsigned long reg, unsigned long v) { @@ -239,13 +241,5 @@ extern __inline int hard_smp_processor_id(void) #define SMP_FROM_INT 1 #define SMP_FROM_SYSCALL 2 - -#else -#ifndef ASSEMBLY -extern inline int cpu_logical_map(int cpu) -{ - return cpu; -} -#endif #endif #endif diff --git a/include/asm-i386/smp_lock.h b/include/asm-i386/smp_lock.h deleted file mode 100644 index fc7eb94de..000000000 --- a/include/asm-i386/smp_lock.h +++ /dev/null @@ -1,91 +0,0 @@ -#ifndef __I386_SMPLOCK_H -#define __I386_SMPLOCK_H - -#define __STR(x) #x - -#ifndef __SMP__ - -#define lock_kernel() do { } while(0) -#define unlock_kernel() do { } while(0) -#define release_kernel_lock(task, cpu, depth) ((depth) = 1) -#define reacquire_kernel_lock(task, cpu, depth) do { } while(0) - -#else - -#include <asm/hardirq.h> - -/* Release global kernel lock and global interrupt lock */ -#define release_kernel_lock(task, cpu, depth) \ -do { \ - if ((depth = (task)->lock_depth) != 0) { \ - __cli(); \ - (task)->lock_depth = 0; \ - active_kernel_processor = NO_PROC_ID; \ - clear_bit(0,&kernel_flag); \ - } \ - release_irqlock(cpu); \ - __sti(); \ -} while (0) - -/* Re-acquire the kernel lock */ -#define reacquire_kernel_lock(task, cpu, depth) \ -do { if (depth) __asm__ __volatile__( \ - "cli\n\t" \ - "call __lock_kernel\n\t" \ - "movl %2,%0\n\t" \ - "sti" \ - : "=m" (task->lock_depth) \ - : "d" (cpu), "c" (depth)); \ -} while (0) - - -extern const char lk_lockmsg[]; - -/* Locking the kernel */ -extern __inline__ void lock_kernel(void) -{ - int cpu = smp_processor_id(); - - if (local_irq_count[cpu]) { - __label__ l1; -l1: printk(lk_lockmsg, &&l1); - } - if (cpu == global_irq_holder) { - __label__ l2; -l2: printk("Ugh at %p\n", &&l2); - sti(); - } - - __asm__ __volatile__(" - pushfl - cli - cmpl $0, %0 - jne 0f - call __lock_kernel -0: incl %0 - popfl -" : - : "m" (current->lock_depth), "d" (cpu) - : "memory"); -} - -extern __inline__ void unlock_kernel(void) -{ - __asm__ __volatile__(" - pushfl - cli - decl %0 - jnz 1f - movb %1, " __STR(active_kernel_processor) " - lock - btrl $0, " __STR(kernel_flag) " -1: - popfl -" : /* no outputs */ - : "m" (current->lock_depth), "i" (NO_PROC_ID) - : "ax", "memory"); -} - -#endif /* __SMP__ */ - -#endif /* __I386_SMPLOCK_H */ diff --git a/include/asm-i386/smplock.h b/include/asm-i386/smplock.h new file mode 100644 index 000000000..3bb933e42 --- /dev/null +++ b/include/asm-i386/smplock.h @@ -0,0 +1,59 @@ +/* + * <asm/smplock.h> + * + * i386 SMP lock implementation + */ +#include <linux/interrupt.h> +#include <asm/spinlock.h> + +extern spinlock_t kernel_flag; + +/* + * Release global kernel lock and global interrupt lock + */ +#define release_kernel_lock(task, cpu) \ +do { \ + if (task->lock_depth >= 0) \ + spin_unlock(&kernel_flag); \ + release_irqlock(cpu); \ + __sti(); \ +} while (0) + +/* + * Re-acquire the kernel lock + */ +#define reacquire_kernel_lock(task) \ +do { \ + if (task->lock_depth >= 0) \ + spin_lock(&kernel_flag); \ +} while (0) + + +/* + * Getting the big kernel lock. + * + * This cannot happen asynchronously, + * so we only need to worry about other + * CPU's. + */ +extern __inline__ void lock_kernel(void) +{ + __asm__ __volatile__( + "incl %1\n\t" + "jne 9f" + spin_lock_string + "\n9:" + :"=m" (__dummy_lock(&kernel_flag)), + "=m" (current->lock_depth)); +} + +extern __inline__ void unlock_kernel(void) +{ + __asm__ __volatile__( + "decl %1\n\t" + "jns 9f\n" + spin_unlock_string + "\n9:" + :"=m" (__dummy_lock(&kernel_flag)), + "=m" (current->lock_depth)); +} diff --git a/include/asm-i386/softirq.h b/include/asm-i386/softirq.h index 008edf305..f77cce80a 100644 --- a/include/asm-i386/softirq.h +++ b/include/asm-i386/softirq.h @@ -50,7 +50,7 @@ static inline void end_bh_atomic(void) atomic_dec(&global_bh_lock); } -/* These are for the irq's testing the lock */ +/* These are for the IRQs testing the lock */ static inline int softirq_trylock(int cpu) { if (!test_and_set_bit(0,&global_bh_count)) { diff --git a/include/asm-i386/spinlock.h b/include/asm-i386/spinlock.h index e6a42b227..e6fdf42f1 100644 --- a/include/asm-i386/spinlock.h +++ b/include/asm-i386/spinlock.h @@ -9,9 +9,16 @@ /* * Your basic spinlocks, allowing only a single CPU anywhere + * + * Gcc-2.7.x has a nasty bug with empty initializers. */ -typedef struct { } spinlock_t; -#define SPIN_LOCK_UNLOCKED { } +#if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8) + typedef struct { } spinlock_t; + #define SPIN_LOCK_UNLOCKED { } +#else + typedef struct { int gcc_is_buggy; } spinlock_t; + #define SPIN_LOCK_UNLOCKED { 0 } +#endif #define spin_lock_init(lock) do { } while(0) #define spin_lock(lock) do { } while(0) @@ -61,14 +68,14 @@ typedef struct { #define spin_lock_init(x) do { (x)->lock = 0; } while (0) #define spin_trylock(lock) (!test_and_set_bit(0,(lock))) -#define spin_lock(x) do {unsigned long __spinflags; save_flags(__spinflags); cli(); if ((x)->lock&&(x)->babble) {printk("%s: spin_lock(%s:%p) already locked\n", __BASE_FILE__, (x)->module, (x));(x)->babble--;} (x)->lock = 1; restore_flags(__spinflags);} while (0) -#define spin_unlock_wait(x) do {unsigned long __spinflags; save_flags(__spinflags); cli(); if ((x)->lock&&(x)->babble) {printk("%s: spin_unlock_wait(%s:%p) deadlock\n", __BASE_FILE__, (x)->module, (x));(x)->babble--;} restore_flags(__spinflags);} while (0) -#define spin_unlock(x) do {unsigned long __spinflags; save_flags(__spinflags); cli(); if (!(x)->lock&&(x)->babble) {printk("%s: spin_unlock(%s:%p) not locked\n", __BASE_FILE__, (x)->module, (x));(x)->babble--;} (x)->lock = 0; restore_flags(__spinflags);} while (0) -#define spin_lock_irq(x) do {cli(); if ((x)->lock&&(x)->babble) {printk("%s: spin_lock_irq(%s:%p) already locked\n", __BASE_FILE__, (x)->module, (x));(x)->babble--;} (x)->lock = 1;} while (0) -#define spin_unlock_irq(x) do {cli(); if ((x)->lock&&(x)->babble) {printk("%s: spin_lock(%s:%p) already locked\n", __BASE_FILE__, (x)->module, (x));(x)->babble--;} (x)->lock = 1; sti();} while (0) +#define spin_lock(x) do {unsigned long __spinflags; save_flags(__spinflags); cli(); if ((x)->lock&&(x)->babble) {printk("%s:%d: spin_lock(%s:%p) already locked\n", __BASE_FILE__,__LINE__, (x)->module, (x));(x)->babble--;} (x)->lock = 1; restore_flags(__spinflags);} while (0) +#define spin_unlock_wait(x) do {unsigned long __spinflags; save_flags(__spinflags); cli(); if ((x)->lock&&(x)->babble) {printk("%s:%d: spin_unlock_wait(%s:%p) deadlock\n", __BASE_FILE__,__LINE__, (x)->module, (x));(x)->babble--;} restore_flags(__spinflags);} while (0) +#define spin_unlock(x) do {unsigned long __spinflags; save_flags(__spinflags); cli(); if (!(x)->lock&&(x)->babble) {printk("%s:%d: spin_unlock(%s:%p) not locked\n", __BASE_FILE__,__LINE__, (x)->module, (x));(x)->babble--;} (x)->lock = 0; restore_flags(__spinflags);} while (0) +#define spin_lock_irq(x) do {cli(); if ((x)->lock&&(x)->babble) {printk("%s:%d: spin_lock_irq(%s:%p) already locked\n", __BASE_FILE__,__LINE__, (x)->module, (x));(x)->babble--;} (x)->lock = 1;} while (0) +#define spin_unlock_irq(x) do {cli(); if (!(x)->lock&&(x)->babble) {printk("%s:%d: spin_lock(%s:%p) not locked\n", __BASE_FILE__,__LINE__, (x)->module, (x));(x)->babble--;} (x)->lock = 0; sti();} while (0) -#define spin_lock_irqsave(x,flags) do {save_flags(flags); cli(); if ((x)->lock&&(x)->babble) {printk("%s: spin_lock_irqsave(%s:%p) already locked\n", __BASE_FILE__, (x)->module, (x));(x)->babble--;} (x)->lock = 1;} while (0) -#define spin_unlock_irqrestore(x,flags) do {cli(); if (!(x)->lock&&(x)->babble) {printk("%s: spin_unlock_irqrestore(%s:%p) not locked\n", __BASE_FILE__, (x)->module, (x));(x)->babble--;} (x)->lock = 0; restore_flags(flags);} while (0) +#define spin_lock_irqsave(x,flags) do {save_flags(flags); cli(); if ((x)->lock&&(x)->babble) {printk("%s:%d: spin_lock_irqsave(%s:%p) already locked\n", __BASE_FILE__,__LINE__, (x)->module, (x));(x)->babble--;} (x)->lock = 1;} while (0) +#define spin_unlock_irqrestore(x,flags) do {cli(); if (!(x)->lock&&(x)->babble) {printk("%s:%d: spin_unlock_irqrestore(%s:%p) not locked\n", __BASE_FILE__,__LINE__, (x)->module, (x));(x)->babble--;} (x)->lock = 0; restore_flags(flags);} while (0) #endif /* DEBUG_SPINLOCKS */ @@ -128,8 +135,7 @@ typedef struct { typedef struct { unsigned long a[100]; } __dummy_lock_t; #define __dummy_lock(lock) (*(__dummy_lock_t *)(lock)) -#define spin_lock(lock) \ -__asm__ __volatile__( \ +#define spin_lock_string \ "\n1:\t" \ "lock ; btsl $0,%0\n\t" \ "jc 2f\n" \ @@ -138,12 +144,19 @@ __asm__ __volatile__( \ "testb $1,%0\n\t" \ "jne 2b\n\t" \ "jmp 1b\n" \ - ".previous" \ + ".previous" + +#define spin_unlock_string \ + "lock ; btrl $0,%0" + +#define spin_lock(lock) \ +__asm__ __volatile__( \ + spin_lock_string \ :"=m" (__dummy_lock(lock))) #define spin_unlock(lock) \ __asm__ __volatile__( \ - "lock ; btrl $0,%0" \ + spin_unlock_string \ :"=m" (__dummy_lock(lock))) #define spin_trylock(lock) (!test_and_set_bit(0,(lock))) diff --git a/include/asm-i386/string.h b/include/asm-i386/string.h index df02f7809..65d72fabf 100644 --- a/include/asm-i386/string.h +++ b/include/asm-i386/string.h @@ -403,7 +403,7 @@ extern inline void * __constant_memcpy(void * to, const void * from, size_t n) case 4: *(unsigned long *)to = *(const unsigned long *)from; return to; - case 6: /* for ethernet addresses */ + case 6: /* for Ethernet addresses */ *(unsigned long *)to = *(const unsigned long *)from; *(2+(unsigned short *)to) = *(2+(const unsigned short *)from); return to; diff --git a/include/asm-i386/system.h b/include/asm-i386/system.h index 88c8ebc99..91b98d5e8 100644 --- a/include/asm-i386/system.h +++ b/include/asm-i386/system.h @@ -1,6 +1,7 @@ #ifndef __ASM_SYSTEM_H #define __ASM_SYSTEM_H +#include <linux/kernel.h> #include <asm/segment.h> /* @@ -35,84 +36,37 @@ __asm__("str %%ax\n\t" \ :"=a" (n) \ :"0" (0),"i" (FIRST_TSS_ENTRY<<3)) -/* This special macro can be used to load a debugging register */ - -#define loaddebug(tsk,register) \ - __asm__("movl %0,%%db" #register \ - : /* no output */ \ - :"r" (tsk->debugreg[register])) +#ifdef __KERNEL__ +struct task_struct; /* one of the stranger aspects of C forward declarations.. */ +extern void FASTCALL(__switch_to(struct task_struct *prev, struct task_struct *next)); /* - * switch_to(n) should switch tasks to task nr n, first - * checking that n isn't the current task, in which case it does nothing. - * This also clears the TS-flag if the task we switched to has used - * the math co-processor latest. - * - * It also reloads the debug regs if necessary.. + * We do most of the task switching in C, but we need + * to do the EIP/ESP switch in assembly.. */ - - -#ifdef __SMP__ - /* - * Keep the lock depth straight. If we switch on an interrupt from - * kernel->user task we need to lose a depth, and if we switch the - * other way we need to gain a depth. Same layer switches come out - * the same. - * - * We spot a switch in user mode because the kernel counter is the - * same as the interrupt counter depth. (We never switch during the - * message/invalidate IPI). - * - * We fsave/fwait so that an exception goes off at the right time - * (as a call from the fsave or fwait in effect) rather than to - * the wrong process. - */ - -#define switch_to(prev,next) do { \ - if(prev->flags&PF_USEDFPU) \ - { \ - __asm__ __volatile__("fnsave %0":"=m" (prev->tss.i387.hard)); \ - __asm__ __volatile__("fwait"); \ - prev->flags&=~PF_USEDFPU; \ - } \ -__asm__("ljmp %0\n\t" \ - : /* no output */ \ - :"m" (*(((char *)&next->tss.tr)-4)), \ - "c" (next)); \ - /* Now maybe reload the debug registers */ \ - if(prev->debugreg[7]){ \ - loaddebug(prev,0); \ - loaddebug(prev,1); \ - loaddebug(prev,2); \ - loaddebug(prev,3); \ - loaddebug(prev,6); \ - loaddebug(prev,7); \ - } \ +#define switch_to(prev,next) do { \ + unsigned long eax, edx, ecx; \ + asm volatile("pushl %%ebx\n\t" \ + "pushl %%esi\n\t" \ + "pushl %%edi\n\t" \ + "pushl %%ebp\n\t" \ + "movl %%esp,%0\n\t" /* save ESP */ \ + "movl %5,%%esp\n\t" /* restore ESP */ \ + "movl $1f,%1\n\t" /* save EIP */ \ + "pushl %6\n\t" /* restore EIP */ \ + "jmp __switch_to\n" \ + "1:\t" \ + "popl %%ebp\n\t" \ + "popl %%edi\n\t" \ + "popl %%esi\n\t" \ + "popl %%ebx" \ + :"=m" (prev->tss.esp),"=m" (prev->tss.eip), \ + "=a" (eax), "=d" (edx), "=c" (ecx) \ + :"m" (next->tss.esp),"m" (next->tss.eip), \ + "a" (prev), "d" (next)); \ } while (0) -#else -#define switch_to(prev,next) do { \ -__asm__("ljmp %0\n\t" \ - "cmpl %1,"SYMBOL_NAME_STR(last_task_used_math)"\n\t" \ - "jne 1f\n\t" \ - "clts\n" \ - "1:" \ - : /* no outputs */ \ - :"m" (*(((char *)&next->tss.tr)-4)), \ - "r" (prev), "r" (next)); \ - /* Now maybe reload the debug registers */ \ - if(prev->debugreg[7]){ \ - loaddebug(prev,0); \ - loaddebug(prev,1); \ - loaddebug(prev,2); \ - loaddebug(prev,3); \ - loaddebug(prev,6); \ - loaddebug(prev,7); \ - } \ -} while (0) -#endif - #define _set_base(addr,base) \ __asm__("movw %%dx,%0\n\t" \ "rorl $16,%%edx\n\t" \ @@ -157,15 +111,26 @@ static inline unsigned long _get_base(char * addr) #define get_base(ldt) _get_base( ((char *)&(ldt)) ) -static inline unsigned long get_limit(unsigned long segment) -{ - unsigned long __limit; - __asm__("lsll %1,%0" - :"=r" (__limit):"r" (segment)); - return __limit+1; -} - -#define nop() __asm__ __volatile__ ("nop") +/* + * Load a segment. Fall back on loading the zero + * segment if something goes wrong.. + */ +#define loadsegment(seg,value) \ + asm volatile("\n" \ + "1:\t" \ + "movl %0,%%" #seg "\n" \ + "2:\n" \ + ".section fixup,\"ax\"\n" \ + "3:\t" \ + "pushl $0\n\t" \ + "popl %%" #seg "\n\t" \ + "jmp 2b\n" \ + ".previous\n" \ + ".section __ex_table,\"a\"\n\t" \ + ".align 4\n\t" \ + ".long 1b,3b\n" \ + ".previous" \ + : :"m" (*(unsigned int *)&(value))) /* * Clear and set 'TS' bit respectively @@ -180,6 +145,17 @@ __asm__ __volatile__ ( \ : /* no inputs */ \ :"ax") +#endif /* __KERNEL__ */ + +static inline unsigned long get_limit(unsigned long segment) +{ + unsigned long __limit; + __asm__("lsll %1,%0" + :"=r" (__limit):"r" (segment)); + return __limit+1; +} + +#define nop() __asm__ __volatile__ ("nop") #define xchg(ptr,x) ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr)))) #define tas(ptr) (xchg((ptr),1)) diff --git a/include/asm-i386/termios.h b/include/asm-i386/termios.h index 6deebbb03..b2b77853f 100644 --- a/include/asm-i386/termios.h +++ b/include/asm-i386/termios.h @@ -47,6 +47,7 @@ struct termio { #define N_AX25 5 #define N_X25 6 /* X.25 async */ #define N_6PACK 7 +#define N_MASC 8 /* Reserved fo Mobitex module <kaz@cafe.net> */ #ifdef __KERNEL__ diff --git a/include/asm-i386/timex.h b/include/asm-i386/timex.h new file mode 100644 index 000000000..c492e1b93 --- /dev/null +++ b/include/asm-i386/timex.h @@ -0,0 +1,15 @@ +/* + * linux/include/asm-i386/timex.h + * + * i386 architecture timex specifications + */ +#ifndef _ASMi386_TIMEX_H +#define _ASMi386_TIMEX_H + +#define CLOCK_TICK_RATE 1193180 /* Underlying HZ */ +#define CLOCK_TICK_FACTOR 20 /* Factor of both 1000000 and CLOCK_TICK_RATE */ +#define FINETUNE ((((((long)LATCH * HZ - CLOCK_TICK_RATE) << SHIFT_HZ) * \ + (1000000/CLOCK_TICK_FACTOR) / (CLOCK_TICK_RATE/CLOCK_TICK_FACTOR)) \ + << (SHIFT_SCALE-SHIFT_HZ)) / HZ) + +#endif diff --git a/include/asm-i386/unistd.h b/include/asm-i386/unistd.h index 018f6f0f5..1b23625c6 100644 --- a/include/asm-i386/unistd.h +++ b/include/asm-i386/unistd.h @@ -27,7 +27,7 @@ #define __NR_lseek 19 #define __NR_getpid 20 #define __NR_mount 21 -#define __NR_umount 22 +#define __NR_oldumount 22 #define __NR_setuid 23 #define __NR_getuid 24 #define __NR_stime 25 @@ -57,7 +57,7 @@ #define __NR_geteuid 49 #define __NR_getegid 50 #define __NR_acct 51 -#define __NR_phys 52 +#define __NR_umount 52 #define __NR_lock 53 #define __NR_ioctl 54 #define __NR_fcntl 55 @@ -191,6 +191,10 @@ #define __NR_getcwd 183 #define __NR_capget 184 #define __NR_capset 185 +#define __NR_sigaltstack 186 +#define __NR_sendfile 187 +#define __NR_streams1 188 /* some people actually want it */ +#define __NR_streams2 189 /* some people actually want it */ /* user-visible error numbers are in the range -1 - -122: see <asm-i386/errno.h> */ diff --git a/include/asm-i386/user.h b/include/asm-i386/user.h index b5acf0e74..b0d067e7a 100644 --- a/include/asm-i386/user.h +++ b/include/asm-i386/user.h @@ -79,7 +79,7 @@ struct user{ esp register. */ long int signal; /* Signal that caused the core dump. */ int reserved; /* No longer used */ - struct pt_regs * u_ar0; /* Used by gdb to help find the values for */ + struct user_pt_regs * u_ar0; /* Used by gdb to help find the values for */ /* the registers. */ struct user_i387_struct* u_fpstate; /* Math Co-processor pointer. */ unsigned long magic; /* To uniquely identify a core file */ diff --git a/include/asm-i386/vga.h b/include/asm-i386/vga.h new file mode 100644 index 000000000..ef0c0e50c --- /dev/null +++ b/include/asm-i386/vga.h @@ -0,0 +1,20 @@ +/* + * Access to VGA videoram + * + * (c) 1998 Martin Mares <mj@ucw.cz> + */ + +#ifndef _LINUX_ASM_VGA_H_ +#define _LINUX_ASM_VGA_H_ + +/* + * On the PC, we can just recalculate addresses and then + * access the videoram directly without any black magic. + */ + +#define VGA_MAP_MEM(x) (unsigned long)phys_to_virt(x) + +#define vga_readb(x) (*(x)) +#define vga_writeb(x,y) (*(y) = (x)) + +#endif diff --git a/include/asm-i386/vm86.h b/include/asm-i386/vm86.h index 88d0bf510..40ec82c69 100644 --- a/include/asm-i386/vm86.h +++ b/include/asm-i386/vm86.h @@ -60,7 +60,7 @@ #define VM86_GET_AND_RESET_IRQ 6 /* - * This is the stack-layout seen by the user space programm when we have + * This is the stack-layout seen by the user space program when we have * done a translation of "SAVE_ALL" from vm86 mode. The real kernel layout * is 'kernel_vm86_regs' (see below). */ @@ -193,7 +193,7 @@ struct kernel_vm86_struct { * this way. In front of 'return-eip' may be some data, depending on * compilation, so we don't rely on this and save the pointer to 'oldregs' * in 'regs32' above. - * However, with GCC-2.7.2 and the the current CFLAGS you see exactly this: + * However, with GCC-2.7.2 and the current CFLAGS you see exactly this: long return-eip; from call to vm86() struct pt_regs oldregs; user space registers as saved by syscall diff --git a/include/asm-m68k/adb.h b/include/asm-m68k/adb.h new file mode 100644 index 000000000..9176b5518 --- /dev/null +++ b/include/asm-m68k/adb.h @@ -0,0 +1,75 @@ +/* + * Definitions for talking to ADB and CUDA. The CUDA is a microcontroller + * which controls the ADB, system power, RTC, and various other things on + * later Macintoshes + * + * Copyright (C) 1996 Paul Mackerras. + */ + +/* First byte sent to or received from CUDA */ +#define ADB_PACKET 0 +#define CUDA_PACKET 1 +#define ERROR_PACKET 2 +#define TIMER_PACKET 3 +#define POWER_PACKET 4 +#define MACIIC_PACKET 5 + +/* ADB commands (2nd byte) */ +#define ADB_BUSRESET 0 +#define ADB_FLUSH(id) (1 + ((id) << 4)) +#define ADB_WRITEREG(id, reg) (8 + (reg) + ((id) << 4)) +#define ADB_READREG(id, reg) (0xc + (reg) + ((id) << 4)) + +/* ADB default device IDs (upper 4 bits of 2nd byte) */ +#define ADB_DONGLE 1 /* "software execution control" devices */ +#define ADB_KEYBOARD 2 +#define ADB_MOUSE 3 +#define ADB_TABLET 4 +#define ADB_MODEM 5 +#define ADB_MISC 7 /* maybe a monitor */ + +/* CUDA commands (2nd byte) */ +#define CUDA_WARM_START 0 +#define CUDA_AUTOPOLL 1 +#define CUDA_GET_6805_ADDR 2 +#define CUDA_GET_TIME 3 +#define CUDA_GET_PRAM 7 +#define CUDA_SET_6805_ADDR 8 +#define CUDA_SET_TIME 9 +#define CUDA_POWERDOWN 0xa +#define CUDA_POWERUP_TIME 0xb +#define CUDA_SET_PRAM 0xc +#define CUDA_MS_RESET 0xd +#define CUDA_SEND_DFAC 0xe +#define CUDA_RESET_SYSTEM 0x11 +#define CUDA_SET_IPL 0x12 +#define CUDA_SET_AUTO_RATE 0x14 +#define CUDA_GET_AUTO_RATE 0x16 +#define CUDA_SET_DEVICE_LIST 0x19 +#define CUDA_GET_DEVICE_LIST 0x1a +#define CUDA_GET_SET_IIC 0x22 + +#ifdef __KERNEL__ + +struct adb_request { + unsigned char data[16]; + int nbytes; + unsigned char reply[16]; + int reply_len; + unsigned char reply_expected; + unsigned char sent; + unsigned char got_reply; + void (*done)(struct adb_request *); + void *arg; + struct adb_request *next; +}; + +void via_adb_init(void); +int adb_request(struct adb_request *req, + void (*done)(struct adb_request *), int nbytes, ...); +int adb_send_request(struct adb_request *req); +void adb_poll(void); +int adb_register(int default_id, + void (*handler)(unsigned char *, int, struct pt_regs *)); + +#endif /* __KERNEL */ diff --git a/include/asm-m68k/amigahw.h b/include/asm-m68k/amigahw.h index caaa8d0de..a5d105979 100644 --- a/include/asm-m68k/amigahw.h +++ b/include/asm-m68k/amigahw.h @@ -332,4 +332,4 @@ struct tod2000 { #define TOD2000_HOUR1_PM (1<<2) #define TOD_2000 ((struct tod2000 *)(zTwoBase+0xDC0000)) -#endif /* __ASMm68k_AMIGAHW_H */ +#endif /* _M68K_AMIGAHW_H */ diff --git a/include/asm-m68k/amigardb.h b/include/asm-m68k/amigardb.h deleted file mode 100644 index 57032469d..000000000 --- a/include/asm-m68k/amigardb.h +++ /dev/null @@ -1,126 +0,0 @@ -#ifndef _LINUX_AMIGARDB_H -#define _LINUX_AMIGARDB_H 1 - -#define ULONG u_long -#define LONG long -#define UBYTE u_char - -/* definitions for the Amiga RigidDiskBlock layout, which always starts in - cylinder 0 of a medium. Taken from page 254f of the RKM: Devices */ - -struct RigidDiskBlock { - ULONG rdb_ID; /* 4 character identifier */ - ULONG rdb_SummedLongs; /* size of this checksummed structure */ - LONG rdb_ChkSum; /* block checksum (longword sum to zero) */ - ULONG rdb_HostID; /* SCSI Target ID of host */ - ULONG rdb_BlockBytes; /* size of disk blocks */ - ULONG rdb_Flags; /* see below for defines */ - /* block list heads */ - ULONG rdb_BadBlockList; /* optional bad block list */ - ULONG rdb_PartitionList; /* optional first partition block */ - ULONG rdb_FileSysHeaderList; /* optional file system header block */ - ULONG rdb_DriveInit; /* optional drive-specific init code */ - /* DriveInit(lun,rdb,ior): "C" stk & d0/a0/a1 */ - ULONG rdb_Reserved1[6]; /* set to $ffffffff */ - /* physical drive characteristics */ - ULONG rdb_Cylinders; /* number of drive cylinders */ - ULONG rdb_Sectors; /* sectors per track */ - ULONG rdb_Heads; /* number of drive heads */ - ULONG rdb_Interleave; /* interleave */ - ULONG rdb_Park; /* landing zone cylinder */ - ULONG rdb_Reserved2[3]; - ULONG rdb_WritePreComp; /* starting cylinder: write precompensation */ - ULONG rdb_ReducedWrite; /* starting cylinder: reduced write current */ - ULONG rdb_StepRate; /* drive step rate */ - ULONG rdb_Reserved3[5]; - /* logical drive characteristics */ - ULONG rdb_RDBBlocksLo; /* low block of range reserved for hardblocks */ - ULONG rdb_RDBBlocksHi; /* high block of range for these hardblocks */ - ULONG rdb_LoCylinder; /* low cylinder of partitionable disk area */ - ULONG rdb_HiCylinder; /* high cylinder of partitionable data area */ - ULONG rdb_CylBlocks; /* number of blocks available per cylinder */ - ULONG rdb_AutoParkSeconds; /* zero for no auto park */ - ULONG rdb_HighRDSKBlock; /* highest block used by RDSK */ - /* (not including replacement bad blocks) */ - ULONG rdb_Reserved4; - /* drive identification */ - char rdb_DiskVendor[8]; - char rdb_DiskProduct[16]; - char rdb_DiskRevision[4]; - char rdb_ControllerVendor[8]; - char rdb_ControllerProduct[16]; - char rdb_ControllerRevision[4]; - ULONG rdb_Reserved5[10]; -}; - -#define IDNAME_RIGIDDISK 0x5244534B /* 'RDSK' */ - -#define RDB_LOCATION_LIMIT 16 - -#define RDBFB_LAST 0 /* no disks exist to be configured after */ -#define RDBFF_LAST 0x01L /* this one on this controller */ -#define RDBFB_LASTLUN 1 /* no LUNs exist to be configured greater */ -#define RDBFF_LASTLUN 0x02L /* than this one at this SCSI Target ID */ -#define RDBFB_LASTTID 2 /* no Target IDs exist to be configured */ -#define RDBFF_LASTTID 0x04L /* greater than this one on this SCSI bus */ -#define RDBFB_NORESELECT 3 /* don't bother trying to perform reselection */ -#define RDBFF_NORESELECT 0x08L /* when talking to this drive */ -#define RDBFB_DISKID 4 /* rdb_Disk... identification valid */ -#define RDBFF_DISKID 0x10L -#define RDBFB_CTRLRID 5 /* rdb_Controller... identification valid */ -#define RDBFF_CTRLRID 0x20L - /* added 7/20/89 by commodore: */ -#define RDBFB_SYNCH 6 /* drive supports scsi synchronous mode */ -#define RDBFF_SYNCH 0x40L /* CAN BE DANGEROUS TO USE IF IT DOESN'T! */ - -struct PartitionBlock { - ULONG pb_ID; /* 4 character identifier */ - ULONG pb_SummedLongs; /* size of this checksummed structure */ - LONG pb_ChkSum; /* block checksum (longword sum to zero) */ - ULONG pb_HostID; /* SCSI Target ID of host */ - ULONG pb_Next; /* block number of the next PartitionBlock */ - ULONG pb_Flags; /* see below for defines */ - ULONG pb_Reserved1[2]; - ULONG pb_DevFlags; /* preferred flags for OpenDevice */ - UBYTE pb_DriveName[32]; /* preferred DOS device name: BSTR form */ - /* (not used if this name is in use) */ - ULONG pb_Reserved2[15]; /* filler to 32 longwords */ - ULONG pb_Environment[17]; /* environment vector for this partition */ - ULONG pb_EReserved[15]; /* reserved for future environment vector */ -}; - -#define IDNAME_PARTITION 0x50415254 /* 'PART' */ - -#define PBFB_BOOTABLE 0 /* this partition is intended to be bootable */ -#define PBFF_BOOTABLE 1L /* (expected directories and files exist) */ -#define PBFB_NOMOUNT 1 /* do not mount this partition (e.g. manually */ -#define PBFF_NOMOUNT 2L /* mounted, but space reserved here) */ - -/* this is from <dos/filehandler.h> */ - -#define DE_TABLESIZE 0 /* minimum value is 11 (includes NumBuffers) */ -#define DE_SIZEBLOCK 1 /* in longwords: standard value is 128 */ -#define DE_SECORG 2 /* not used; must be 0 */ -#define DE_NUMHEADS 3 /* # of heads (surfaces). drive specific */ -#define DE_SECSPERBLK 4 /* not used; must be 1 */ -#define DE_BLKSPERTRACK 5 /* blocks per track. drive specific */ -#define DE_RESERVEDBLKS 6 /* unavailable blocks at start. usually 2 */ -#define DE_PREFAC 7 /* not used; must be 0 */ -#define DE_INTERLEAVE 8 /* usually 0 */ -#define DE_LOWCYL 9 /* starting cylinder. typically 0 */ -#define DE_UPPERCYL 10 /* max cylinder. drive specific */ -#define DE_NUMBUFFERS 11 /* starting # of buffers. typically 5 */ -#define DE_MEMBUFTYPE 12 /* type of mem to allocate for buffers. */ -#define DE_BUFMEMTYPE 12 /* same as above, better name - * 1 is public, 3 is chip, 5 is fast */ -#define DE_MAXTRANSFER 13 /* Max number bytes to transfer at a time */ -#define DE_MASK 14 /* Address Mask to block out certain memory */ -#define DE_BOOTPRI 15 /* Boot priority for autoboot */ -#define DE_DOSTYPE 16 /* ASCII (HEX) string showing filesystem type; - * 0X444F5300 is old filesystem, - * 0X444F5301 is fast file system */ -#define DE_BAUD 17 /* Baud rate for serial handler */ -#define DE_CONTROL 18 /* Control word for handler/filesystem */ -#define DE_BOOTBLOCKS 19 /* Number of blocks containing boot code */ - -#endif /* _LINUX_AMIGARDB_H */ diff --git a/include/asm-m68k/amigayle.h b/include/asm-m68k/amigayle.h new file mode 100644 index 000000000..f890d41ae --- /dev/null +++ b/include/asm-m68k/amigayle.h @@ -0,0 +1,105 @@ +/* +** asm-m68k/amigayle.h -- This header defines the registers of the gayle chip +** found on the Amiga 1200 +** This information was found by disassembling card.resource, +** so the definitions may not be 100% correct +** anyone has an official doc ? +** +** Copyright 1997 by Alain Malek +** +** This file is subject to the terms and conditions of the GNU General Public +** License. See the file COPYING in the main directory of this archive +** for more details. +** +** Created: 11/28/97 by Alain Malek +*/ + +#ifndef _M68K_AMIGAYLE_H_ +#define _M68K_AMIGAYLE_H_ + +#include <asm/amigahw.h> +#include <asm/io.h> + +/* memory layout */ + +#define GAYLE_RAM (0x600000+zTwoBase) +#define GAYLE_RAMSIZE (0x400000) +#define GAYLE_ATTRIBUTE (0xa00000+zTwoBase) +#define GAYLE_ATTRIBUTESIZE (0x020000) +#define GAYLE_IO (0xa20000+zTwoBase) /* 16bit and even 8bit registers */ +#define GAYLE_IOSIZE (0x010000) +#define GAYLE_IO_8BITODD (0xa30000+zTwoBase) /* odd 8bit registers */ + +/* offset for accessing odd IO registers */ +#define GAYLE_ODD (GAYLE_IO_8BITODD-GAYLE_IO-1) + +/* GAYLE registers */ + +struct GAYLE { + u_char cardstatus; + u_char pad0[0x1000-1]; + + u_char intreq; + u_char pad1[0x1000-1]; + + u_char inten; + u_char pad2[0x1000-1]; + + u_char config; + u_char pad3[0x1000-1]; +}; + +#define GAYLE_ADDRESS (0xda8000) /* gayle main registers base address */ + +#define GAYLE_RESET (0xa40000) /* write 0x00 to start reset, + read 1 byte to stop reset */ + +#define gayle (*(volatile struct GAYLE *)(zTwoBase+GAYLE_ADDRESS)) +#define gayle_reset (*(volatile u_char *)(zTwoBase+GAYLE_RESET)) + +#define gayle_attribute ((volatile u_char *)(GAYLE_ATTRIBUTE)) + +#define gayle_inb(a) readb( GAYLE_IO+(a)+(((a)&1)*GAYLE_ODD) ) +#define gayle_outb(v,a) writeb( v, GAYLE_IO+(a)+(((a)&1)*GAYLE_ODD) ) + +#define gayle_inw(a) readw( GAYLE_IO+(a) ) +#define gayle_outw(v,a) writew( v, GAYLE_IO+(a) ) + +/* GAYLE_CARDSTATUS bit def */ + +#define GAYLE_CS_CCDET 0x40 /* credit card detect */ +#define GAYLE_CS_BVD1 0x20 /* battery voltage detect 1 */ +#define GAYLE_CS_SC 0x20 /* credit card status change */ +#define GAYLE_CS_BVD2 0x10 /* battery voltage detect 2 */ +#define GAYLE_CS_DA 0x10 /* digital audio */ +#define GAYLE_CS_WR 0x08 /* write enable (1 == enabled) */ +#define GAYLE_CS_BSY 0x04 /* credit card busy */ +#define GAYLE_CS_IRQ 0x04 /* interrupt request */ + +/* GAYLE_IRQ bit def */ + +#define GAYLE_IRQ_IDE 0x80 +#define GAYLE_IRQ_CCDET 0x40 +#define GAYLE_IRQ_BVD1 0x20 +#define GAYLE_IRQ_SC 0x20 +#define GAYLE_IRQ_BVD2 0x10 +#define GAYLE_IRQ_DA 0x10 +#define GAYLE_IRQ_WR 0x08 +#define GAYLE_IRQ_BSY 0x04 +#define GAYLE_IRQ_IRQ 0x04 +#define GAYLE_IRQ_IDEACK1 0x02 +#define GAYLE_IRQ_IDEACK0 0x01 + +/* GAYLE_CONFIG bit def + (bit 0-1 for program voltage, bit 2-3 for access speed */ + +#define GAYLE_CFG_0V 0x00 +#define GAYLE_CFG_5V 0x01 +#define GAYLE_CFG_12V 0x02 + +#define GAYLE_CFG_100NS 0x08 +#define GAYLE_CFG_150NS 0x04 +#define GAYLE_CFG_250NS 0x00 +#define GAYLE_CFG_720NS 0x0c + +#endif /* asm-m68k/amigayle.h */ diff --git a/include/asm-m68k/amipcmcia.h b/include/asm-m68k/amipcmcia.h new file mode 100644 index 000000000..78ffce6aa --- /dev/null +++ b/include/asm-m68k/amipcmcia.h @@ -0,0 +1,110 @@ +/* +** asm-m68k/pcmcia.h -- Amiga Linux PCMCIA Definitions +** +** Copyright 1997 by Alain Malek +** +** This file is subject to the terms and conditions of the GNU General Public +** License. See the file COPYING in the main directory of this archive +** for more details. +** +** Created: 12/10/97 by Alain Malek +*/ + +#ifndef __AMIGA_PCMCIA_H__ +#define __AMIGA_PCMCIA_H__ + +#include <asm/amigayle.h> + +/* prototypes */ + +void pcmcia_reset(void); +int pcmcia_copy_tuple(unsigned char tuple_id, void *tuple, int max_len); +void pcmcia_program_voltage(int voltage); +void pcmcia_access_speed(int speed); +void pcmcia_write_enable(void); +void pcmcia_write_disable(void); + +static inline u_char pcmcia_read_status(void) +{ + return (gayle.cardstatus & 0x7c); +} + +static inline u_char pcmcia_get_intreq(void) +{ + return (gayle.intreq); +} + +static inline void pcmcia_ack_int(u_char intreq) +{ + gayle.intreq = ((intreq & 0x2c) ^ 0x2c) | 0xc0; +} + +static inline void pcmcia_enable_irq(void) +{ + gayle.inten = GAYLE_IRQ_IDE|GAYLE_IRQ_IRQ; +} + +static inline void pcmcia_disable_irq(void) +{ + gayle.inten = GAYLE_IRQ_IDE; +} + +#define PCMCIA_INSERTED (gayle.cardstatus & GAYLE_CS_CCDET) + +/* valid voltages for pcmcia_ProgramVoltage */ + +#define PCMCIA_0V 0 +#define PCMCIA_5V 5 +#define PCMCIA_12V 12 + +/* valid speeds for pcmcia_AccessSpeed */ + +#define PCMCIA_SPEED_100NS 100 +#define PCMCIA_SPEED_150NS 150 +#define PCMCIA_SPEED_250NS 250 +#define PCMCIA_SPEED_720NS 720 + +/* PCMCIA Tuple codes */ + +#define CISTPL_NULL 0x00 +#define CISTPL_DEVICE 0x01 +#define CISTPL_LONGLINK_CB 0x02 +#define CISTPL_CONFIG_CB 0x04 +#define CISTPL_CFTABLE_ENTRY_CB 0x05 +#define CISTPL_LONGLINK_MFC 0x06 +#define CISTPL_BAR 0x07 +#define CISTPL_CHECKSUM 0x10 +#define CISTPL_LONGLINK_A 0x11 +#define CISTPL_LONGLINK_C 0x12 +#define CISTPL_LINKTARGET 0x13 +#define CISTPL_NO_LINK 0x14 +#define CISTPL_VERS_1 0x15 +#define CISTPL_ALTSTR 0x16 +#define CISTPL_DEVICE_A 0x17 +#define CISTPL_JEDEC_C 0x18 +#define CISTPL_JEDEC_A 0x19 +#define CISTPL_CONFIG 0x1a +#define CISTPL_CFTABLE_ENTRY 0x1b +#define CISTPL_DEVICE_OC 0x1c +#define CISTPL_DEVICE_OA 0x1d +#define CISTPL_DEVICE_GEO 0x1e +#define CISTPL_DEVICE_GEO_A 0x1f +#define CISTPL_MANFID 0x20 +#define CISTPL_FUNCID 0x21 +#define CISTPL_FUNCE 0x22 +#define CISTPL_SWIL 0x23 +#define CISTPL_END 0xff + +/* FUNCID */ + +#define CISTPL_FUNCID_MULTI 0x00 +#define CISTPL_FUNCID_MEMORY 0x01 +#define CISTPL_FUNCID_SERIAL 0x02 +#define CISTPL_FUNCID_PARALLEL 0x03 +#define CISTPL_FUNCID_FIXED 0x04 +#define CISTPL_FUNCID_VIDEO 0x05 +#define CISTPL_FUNCID_NETWORK 0x06 +#define CISTPL_FUNCID_AIMS 0x07 +#define CISTPL_FUNCID_SCSI 0x08 + +#endif diff --git a/include/asm-m68k/atari_SCCserial.h b/include/asm-m68k/atari_SCCserial.h index 0ab7c15d0..481bd0e11 100644 --- a/include/asm-m68k/atari_SCCserial.h +++ b/include/asm-m68k/atari_SCCserial.h @@ -29,8 +29,9 @@ * clock sources */ #define SCC_BAUD_BASE_MVME_PCLK 781250 /* 12.5 MHz */ -#define SCC_BAUD_BASE_BVM 460800 /* 7.3728 MHz */ #define SCC_BAUD_BASE_MVME 625000 /* 10.000 MHz */ +#define SCC_BAUD_BASE_BVME_PCLK 781250 /* 12.5 MHz */ /* XXX ??? */ +#define SCC_BAUD_BASE_BVME 460800 /* 7.3728 MHz */ /* The SCC configuration structure */ diff --git a/include/asm-m68k/atari_mouse.h b/include/asm-m68k/atari_mouse.h deleted file mode 100644 index 003bf2b21..000000000 --- a/include/asm-m68k/atari_mouse.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef _LINUX_ATARI_MOUSE_H -#define _LINUX_ATARI_MOUSE_H - -/* - * linux/include/linux/atari_mouse.h - * header file for Atari Mouse driver - * by Robert de Vries (robert@and.nl) on 19Jul93 - */ - -struct mouse_status { - char buttons; - short dx; - short dy; - int ready; - int active; - struct wait_queue *wait; - struct fasync_struct *fasyncptr; -}; - -#endif diff --git a/include/asm-m68k/bitops.h b/include/asm-m68k/bitops.h index b2a335a7d..97aac09b2 100644 --- a/include/asm-m68k/bitops.h +++ b/include/asm-m68k/bitops.h @@ -210,6 +210,34 @@ extern __inline__ unsigned long ffz(unsigned long word) return res ^ 31; } +#ifdef __KERNEL__ + +/* + * ffs: find first bit set. This is defined the same way as + * the libc and compiler builtin ffs routines, therefore + * differs in spirit from the above ffz (man ffs). + */ + +extern __inline__ int ffs(int x) +{ + int cnt; + + asm ("bfffo %1{#0:#0}" : "=d" (cnt) : "dm" (x & -x)); + + return 32 - cnt; +} + +/* + * hweightN: returns the hamming weight (i.e. the number + * of bits set) of a N-bit word + */ + +#define hweight32(x) generic_hweight32(x) +#define hweight16(x) generic_hweight16(x) +#define hweight8(x) generic_hweight8(x) + +#endif /* __KERNEL__ */ + /* Bitmap functions for the minix filesystem */ extern __inline__ int diff --git a/include/asm-m68k/blinken.h b/include/asm-m68k/blinken.h new file mode 100644 index 000000000..a6b60dec2 --- /dev/null +++ b/include/asm-m68k/blinken.h @@ -0,0 +1,27 @@ +/* +** asm/blinken.h -- m68k blinkenlights support (currently hp300 only) +** +** (c) 1998 Phil Blundell <philb@gnu.org> +** +** This file is subject to the terms and conditions of the GNU General Public +** License. See the file COPYING in the main directory of this archive +** for more details. +** +*/ + +#ifndef _M68K_BLINKEN_H +#define _M68K_BLINKEN_H + +#include <asm/setup.h> + +#define HP300_LEDS 0xf001ffff + +static __inline__ void blinken_leds(int x) +{ + if (MACH_IS_HP300) + { + *((volatile unsigned char *)HP300_LEDS) = (x); + } +} + +#endif diff --git a/include/asm-m68k/bootinfo.h b/include/asm-m68k/bootinfo.h index 279f82a16..c0a7e6cb0 100644 --- a/include/asm-m68k/bootinfo.h +++ b/include/asm-m68k/bootinfo.h @@ -109,7 +109,7 @@ BIR_data = BIR_size+2 #define ATARI_MACH_AB40 3 /* Afterburner040 on Falcon */ /* - * Macintosh-specific tags + * Macintosh-specific tags (all u_long) */ #define BI_MAC_MODEL 0x8000 /* Mac Gestalt ID (model type) */ @@ -123,9 +123,37 @@ BIR_data = BIR_size+2 #define BI_MAC_GMTBIAS 0x8008 /* Mac GMT timezone offset */ #define BI_MAC_MEMSIZE 0x8009 /* Mac RAM size (sanity check) */ #define BI_MAC_CPUID 0x800a /* Mac CPU type (sanity check) */ +#define BI_MAC_ROMBASE 0x800b /* Mac system ROM base address */ + + /* + * Macintosh hardware profile data - unused, see macintosh.h for + * resonable type values + */ + +#define BI_MAC_VIA1BASE 0x8010 /* Mac VIA1 base address (always present) */ +#define BI_MAC_VIA2BASE 0x8011 /* Mac VIA2 base address (type varies) */ +#define BI_MAC_VIA2TYPE 0x8012 /* Mac VIA2 type (VIA, RBV, OSS) */ +#define BI_MAC_ADBTYPE 0x8013 /* Mac ADB interface type */ +#define BI_MAC_ASCBASE 0x8014 /* Mac Apple Sound Chip base address */ +#define BI_MAC_SCSI5380 0x8015 /* Mac NCR 5380 SCSI (base address, multi) */ +#define BI_MAC_SCSIDMA 0x8016 /* Mac SCSI DMA (base address) */ +#define BI_MAC_SCSI5396 0x8017 /* Mac NCR 53C96 SCSI (base address, multi) */ +#define BI_MAC_IDETYPE 0x8018 /* Mac IDE interface type */ +#define BI_MAC_IDEBASE 0x8019 /* Mac IDE interface base address */ +#define BI_MAC_NUBUS 0x801a /* Mac Nubus type (none, regular, pseudo) */ +#define BI_MAC_SLOTMASK 0x801b /* Mac Nubus slots present */ +#define BI_MAC_SCCTYPE 0x801c /* Mac SCC serial type (normal, IOP) */ +#define BI_MAC_ETHTYPE 0x801d /* Mac builtin ethernet type (Sonic, MACE */ +#define BI_MAC_ETHBASE 0x801e /* Mac builtin ethernet base address */ +#define BI_MAC_PMU 0x801f /* Mac power managment / poweroff hardware */ +#define BI_MAC_IOP_SWIM 0x8020 /* Mac SWIM floppy IOP */ +#define BI_MAC_IOP_ADB 0x8021 /* Mac ADB IOP */ /* * Mac: compatibility with old booter data format (temporarily) + * Fields unused with the new bootinfo can be deleted now; instead of + * adding new fields the struct might be splitted into a hardware address + * part and a hardware type part */ #ifndef __ASSEMBLY__ @@ -198,6 +226,7 @@ struct bootversion { #define ATARI_BOOTI_VERSION MK_BI_VERSION( 2, 1 ) #define MAC_BOOTI_VERSION MK_BI_VERSION( 2, 0 ) #define MVME16x_BOOTI_VERSION MK_BI_VERSION( 2, 0 ) +#define BVME6000_BOOTI_VERSION MK_BI_VERSION( 2, 0 ) #ifdef BOOTINFO_COMPAT_1_0 @@ -233,10 +262,6 @@ struct compat_bi_Atari { #ifndef __ASSEMBLY__ -#define MACHW_DECLARE(name) unsigned name : 1 -#define MACHW_SET(name) (boot_info.bi_mac.hw_present.name = 1) -#define MACHW_PRESENT(name) (boot_info.bi_mac.hw_present.name) - struct compat_bi_Macintosh { unsigned long videoaddr; @@ -261,25 +286,6 @@ struct compat_bi_Macintosh unsigned long rombase; unsigned long adbdelay; unsigned long timedbra; - struct { - /* video hardware */ - /* sound hardware */ - /* disk storage interfaces */ - MACHW_DECLARE(MAC_SCSI); /* Directly mapped NCR5380 */ - MACHW_DECLARE(IDE); /* IDE Interface */ - /* other I/O hardware */ - MACHW_DECLARE(SCC); /* Serial Communications Contr. */ - /* DMA */ - MACHW_DECLARE(SCSI_DMA); /* DMA for the NCR5380 */ - /* real time clocks */ - MACHW_DECLARE(RTC_CLK); /* clock chip */ - /* supporting hardware */ - MACHW_DECLARE(VIA1); /* Versatile Interface Ad. 1 */ - MACHW_DECLARE(VIA2); /* Versatile Interface Ad. 2 */ - MACHW_DECLARE(RBV); /* Versatile Interface Ad. 2+ */ - /* NUBUS */ - MACHW_DECLARE(NUBUS); /* NUBUS */ - } hw_present; }; #else diff --git a/include/asm-m68k/bvme6000hw.h b/include/asm-m68k/bvme6000hw.h new file mode 100644 index 000000000..0218c29dc --- /dev/null +++ b/include/asm-m68k/bvme6000hw.h @@ -0,0 +1,129 @@ +#ifndef _M68K_BVME6000HW_H_ +#define _M68K_BVME6000HW_H_ + +#include <asm/irq.h> + +/* + * PIT structure + */ + +#define BVME_PIT_BASE 0xffa00000 + +typedef struct { + unsigned char + pad_a[3], pgcr, + pad_b[3], psrr, + pad_c[3], paddr, + pad_d[3], pbddr, + pad_e[3], pcddr, + pad_f[3], pivr, + pad_g[3], pacr, + pad_h[3], pbcr, + pad_i[3], padr, + pad_j[3], pbdr, + pad_k[3], paar, + pad_l[3], pbar, + pad_m[3], pcdr, + pad_n[3], psr, + pad_o[3], res1, + pad_p[3], res2, + pad_q[3], tcr, + pad_r[3], tivr, + pad_s[3], res3, + pad_t[3], cprh, + pad_u[3], cprm, + pad_v[3], cprl, + pad_w[3], res4, + pad_x[3], crh, + pad_y[3], crm, + pad_z[3], crl, + pad_A[3], tsr, + pad_B[3], res5; +} PitRegs_t, *PitRegsPtr; + +#define bvmepit ((*(volatile PitRegsPtr)(BVME_PIT_BASE))) + +#define BVME_RTC_BASE 0xff900000 + +typedef struct { + unsigned char + pad_a[3], msr, + pad_b[3], t0cr_rtmr, + pad_c[3], t1cr_omr, + pad_d[3], pfr_icr0, + pad_e[3], irr_icr1, + pad_f[3], bcd_tenms, + pad_g[3], bcd_sec, + pad_h[3], bcd_min, + pad_i[3], bcd_hr, + pad_j[3], bcd_dom, + pad_k[3], bcd_mth, + pad_l[3], bcd_year, + pad_m[3], bcd_ujcc, + pad_n[3], bcd_hjcc, + pad_o[3], bcd_dow, + pad_p[3], t0lsb, + pad_q[3], t0msb, + pad_r[3], t1lsb, + pad_s[3], t1msb, + pad_t[3], cmp_sec, + pad_u[3], cmp_min, + pad_v[3], cmp_hr, + pad_w[3], cmp_dom, + pad_x[3], cmp_mth, + pad_y[3], cmp_dow, + pad_z[3], sav_sec, + pad_A[3], sav_min, + pad_B[3], sav_hr, + pad_C[3], sav_dom, + pad_D[3], sav_mth, + pad_E[3], ram, + pad_F[3], test; +} RtcRegs_t, *RtcPtr_t; + + +#define BVME_I596_BASE 0xff100000 + +#define BVME_ETHIRQ_REG 0xff20000b + +#define BVME_LOCAL_IRQ_STAT 0xff20000f + +#define BVME_ETHERR 0x02 +#define BVME_ABORT_STATUS 0x08 + +#define BVME_NCR53C710_BASE 0xff000000 + +#define BVME_SCC_A_ADDR 0xffb0000b +#define BVME_SCC_B_ADDR 0xffb00003 + +#define BVME_CONFIG_REG 0xff500003 + +#define config_reg_ptr (unsigned char *)BVME_CONFIG_REG + +#define BVME_CONFIG_SW1 0x08 +#define BVME_CONFIG_SW2 0x04 +#define BVME_CONFIG_SW3 0x02 +#define BVME_CONFIG_SW4 0x01 + + +#define BVME_IRQ_TYPE_PRIO 0 + +#define BVME_IRQ_PRN 0x54 +#define BVME_IRQ_I596 0x1a +#define BVME_IRQ_SCSI 0x1b +#define BVME_IRQ_TIMER 0x59 +#define BVME_IRQ_RTC 0x1e +#define BVME_IRQ_ABORT 0x1f + +/* SCC interrupts */ +#define BVME_IRQ_SCC_BASE 0x40 +#define BVME_IRQ_SCCB_TX 0x40 +#define BVME_IRQ_SCCB_STAT 0x42 +#define BVME_IRQ_SCCB_RX 0x44 +#define BVME_IRQ_SCCB_SPCOND 0x46 +#define BVME_IRQ_SCCA_TX 0x48 +#define BVME_IRQ_SCCA_STAT 0x4a +#define BVME_IRQ_SCCA_RX 0x4c +#define BVME_IRQ_SCCA_SPCOND 0x4e + +#endif diff --git a/include/asm-m68k/checksum.h b/include/asm-m68k/checksum.h index 8b7f9d162..d4a6e6fb9 100644 --- a/include/asm-m68k/checksum.h +++ b/include/asm-m68k/checksum.h @@ -39,6 +39,10 @@ extern unsigned int csum_partial_copy_from_user ( const char *src, char *dst, int len, int sum, int *csum_err); +/* FIXME: this needs to be written to really do no check -- Cort */ +#define csum_partial_copy_nocheck(src, dst, len, sum) \ + csum_partial_copy((src), (dst), (len), (sum)) + /* * This is a version of ip_compute_csum() optimized for IP headers, * which always checksum on 4 octet boundaries. diff --git a/include/asm-m68k/entry.h b/include/asm-m68k/entry.h index 2c3182696..b1c102ce2 100644 --- a/include/asm-m68k/entry.h +++ b/include/asm-m68k/entry.h @@ -45,6 +45,7 @@ LTASK_FLAGS = 4 LTASK_SIGPENDING = 8 LTASK_ADDRLIMIT = 12 LTASK_EXECDOMAIN = 16 +LTASK_NEEDRESCHED = 20 LTSS_KSP = 0 LTSS_USP = 4 @@ -54,7 +55,7 @@ LTSS_CRP = 12 LTSS_FPCTXT = 24 /* the following macro is used when enabling interrupts */ -#if defined(MACH_ATARI_ONLY) && !defined(CONFIG_HADES) +#if defined(CONFIG_ATARI_ONLY) && !defined(CONFIG_HADES) /* block out HSYNC on the atari */ #define ALLOWINT 0xfbff #define MAX_NOINT_IPL 3 diff --git a/include/asm-m68k/hardirq.h b/include/asm-m68k/hardirq.h index 76968803b..350fc0f69 100644 --- a/include/asm-m68k/hardirq.h +++ b/include/asm-m68k/hardirq.h @@ -5,6 +5,8 @@ extern unsigned int local_irq_count[NR_CPUS]; +#define in_interrupt() (local_irq_count[smp_processor_id()] + local_bh_count[smp_processor_id()] != 0) + #define hardirq_trylock(cpu) (++local_irq_count[cpu], (cpu) == 0) #define hardirq_endlock(cpu) (--local_irq_count[cpu]) diff --git a/include/asm-m68k/hwtest.h b/include/asm-m68k/hwtest.h new file mode 100644 index 000000000..17d3f0ad7 --- /dev/null +++ b/include/asm-m68k/hwtest.h @@ -0,0 +1,15 @@ +/* Routines to test for presence/absence of hardware registers: + * see arch/m68k/mm/hwtest.c. + * -- PMM <pmaydell@chiark.greenend.org.uk> 05/1998 + * + * Removed initfunc from decls. We might want them in modules, and + * the code is tiny anyway. 16/5/98 pb + */ + +#ifndef __ASM_HWTEST_H +#define __ASM_HWTEST_H + +extern int hwreg_present(volatile void *regp); +extern int hwreg_write(volatile void *regp, unsigned short val); + +#endif diff --git a/include/asm-m68k/ide.h b/include/asm-m68k/ide.h index a69ef5b18..abcd0da25 100644 --- a/include/asm-m68k/ide.h +++ b/include/asm-m68k/ide.h @@ -41,6 +41,10 @@ #include <asm/atari_stdma.h> #endif +#ifdef CONFIG_MAC +#include <asm/macints.h> +#endif + typedef unsigned char * ide_ioreg_t; #ifndef MAX_HWIFS @@ -71,6 +75,10 @@ typedef union { } b; } select_t; +#ifdef CONFIG_MAC /* MSch: Hack; wrapper for ide_intr */ +void mac_ide_intr(int irq, void *dev_id, struct pt_regs *regs); +#endif + static __inline__ int ide_request_irq(unsigned int irq, void (*handler)(int, void *, struct pt_regs *), unsigned long flags, const char *device, void *dev_id) { @@ -78,6 +86,14 @@ static __inline__ int ide_request_irq(unsigned int irq, void (*handler)(int, voi if (MACH_IS_AMIGA) return request_irq(irq, handler, 0, device, dev_id); #endif /* CONFIG_AMIGA */ +#ifdef CONFIG_MAC + if (MACH_IS_MAC) +#if 0 /* MSch Hack: maybe later we'll call ide_intr without a wrapper */ + return nubus_request_irq(12, dev_id, handler); +#else + return nubus_request_irq(12, dev_id, mac_ide_intr); +#endif +#endif /* CONFIG_MAC */ return 0; } @@ -87,6 +103,10 @@ static __inline__ void ide_free_irq(unsigned int irq, void *dev_id) if (MACH_IS_AMIGA) free_irq(irq, dev_id); #endif /* CONFIG_AMIGA */ +#ifdef CONFIG_MAC + if (MACH_IS_MAC) + nubus_free_irq(12); +#endif /* CONFIG_MAC */ } /* @@ -117,81 +137,83 @@ static __inline__ void ide_release_region (ide_ioreg_t from, unsigned int extent #define insl(data_reg, buffer, wcount) insw(data_reg, buffer, (wcount)<<1) #define outsl(data_reg, buffer, wcount) outsw(data_reg, buffer, (wcount)<<1) -#define insw(port, buf, nr) \ - if ((nr) % 16) \ - __asm__ __volatile__ \ - ("movel %0,%/a0; \ - movel %1,%/a1; \ - movel %2,%/d6; \ - subql #1,%/d6; \ - 1:movew %/a0@,%/a1@+; \ - dbra %/d6,1b" : \ - : "g" (port), "g" (buf), "g" (nr) \ - : "a0", "a1", "d6"); \ - else \ - __asm__ __volatile__ \ - ("movel %0,%/a0; \ - movel %1,%/a1; \ - movel %2,%/d6; \ - lsrl #4,%/d6; \ - subql #1,%/d6; \ - 1:movew %/a0@,%/a1@+; \ - movew %/a0@,%/a1@+; \ - movew %/a0@,%/a1@+; \ - movew %/a0@,%/a1@+; \ - movew %/a0@,%/a1@+; \ - movew %/a0@,%/a1@+; \ - movew %/a0@,%/a1@+; \ - movew %/a0@,%/a1@+; \ - movew %/a0@,%/a1@+; \ - movew %/a0@,%/a1@+; \ - movew %/a0@,%/a1@+; \ - movew %/a0@,%/a1@+; \ - movew %/a0@,%/a1@+; \ - movew %/a0@,%/a1@+; \ - movew %/a0@,%/a1@+; \ - movew %/a0@,%/a1@+; \ - dbra %/d6,1b" : \ - : "g" (port), "g" (buf), "g" (nr) \ - : "a0", "a1", "d6") - -#define outsw(port, buf, nr) \ - if ((nr) % 16) \ - __asm__ __volatile__ \ - ("movel %0,%/a0; \ - movel %1,%/a1; \ - movel %2,%/d6; \ - subql #1,%/d6; \ - 1:movew %/a1@+,%/a0@; \ - dbra %/d6,1b" : \ - : "g" (port), "g" (buf), "g" (nr) \ - : "a0", "a1", "d6"); \ - else \ - __asm__ __volatile__ \ - ("movel %0,%/a0; \ - movel %1,%/a1; \ - movel %2,%/d6; \ - lsrl #4,%/d6; \ - subql #1,%/d6; \ - 1:movew %/a1@+,%/a0@; \ - movew %/a1@+,%/a0@; \ - movew %/a1@+,%/a0@; \ - movew %/a1@+,%/a0@; \ - movew %/a1@+,%/a0@; \ - movew %/a1@+,%/a0@; \ - movew %/a1@+,%/a0@; \ - movew %/a1@+,%/a0@; \ - movew %/a1@+,%/a0@; \ - movew %/a1@+,%/a0@; \ - movew %/a1@+,%/a0@; \ - movew %/a1@+,%/a0@; \ - movew %/a1@+,%/a0@; \ - movew %/a1@+,%/a0@; \ - movew %/a1@+,%/a0@; \ - movew %/a1@+,%/a0@; \ - dbra %/d6,1b" : \ - : "g" (port), "g" (buf), "g" (nr) \ - : "a0", "a1", "d6") +#define insw(port, buf, nr) ({ \ + unsigned char *_port = (unsigned char *)(port); \ + unsigned char *_buf = (buf); \ + int _nr = (nr); \ + unsigned long _tmp; \ + \ + if (_nr & 15) { \ + _tmp = (_nr & 15) - 1; \ + asm volatile ( \ + "1: movew %2@,%3@+; dbra %4,1b" \ + : "=a" (_buf), "=d" (_tmp) \ + : "a" (_port), "0" (_buf), \ + "1" (_tmp)); \ + } \ + _tmp = (_nr >> 4) - 1; \ + asm volatile ( \ + "1: " \ + "movew %2@,%3@+; " \ + "movew %2@,%3@+; " \ + "movew %2@,%3@+; " \ + "movew %2@,%3@+; " \ + "movew %2@,%3@+; " \ + "movew %2@,%3@+; " \ + "movew %2@,%3@+; " \ + "movew %2@,%3@+; " \ + "movew %2@,%3@+; " \ + "movew %2@,%3@+; " \ + "movew %2@,%3@+; " \ + "movew %2@,%3@+; " \ + "movew %2@,%3@+; " \ + "movew %2@,%3@+; " \ + "movew %2@,%3@+; " \ + "movew %2@,%3@+; " \ + "dbra %4,1b" \ + : "=a" (_buf), "=d" (_tmp) \ + : "a" (_port), "0" (_buf), \ + "1" (_tmp)); \ +}) + +#define outsw(port, buf, nr) ({ \ + unsigned char *_port = (unsigned char *)(port); \ + unsigned char *_buf = (buf); \ + int _nr = (nr); \ + unsigned long _tmp; \ + \ + if (_nr & 15) { \ + _tmp = (_nr & 15) - 1; \ + asm volatile ( \ + "1: movew %3@,%2@+; dbra %4,1b" \ + : "=a" (_buf), "=d" (_tmp) \ + : "a" (_port), "0" (_buf), \ + "1" (_tmp)); \ + } \ + _tmp = (_nr >> 4) - 1; \ + asm volatile ( \ + "1: " \ + "movew %3@+,%2@; " \ + "movew %3@+,%2@; " \ + "movew %3@+,%2@; " \ + "movew %3@+,%2@; " \ + "movew %3@+,%2@; " \ + "movew %3@+,%2@; " \ + "movew %3@+,%2@; " \ + "movew %3@+,%2@; " \ + "movew %3@+,%2@; " \ + "movew %3@+,%2@; " \ + "movew %3@+,%2@; " \ + "movew %3@+,%2@; " \ + "movew %3@+,%2@; " \ + "movew %3@+,%2@; " \ + "movew %3@+,%2@; " \ + "movew %3@+,%2@; " \ + "dbra %4,1b" \ + : "=a" (_buf), "=d" (_tmp) \ + : "a" (_port), "0" (_buf), \ + "1" (_tmp)); \ +}) #ifdef CONFIG_ATARI #define insl_swapw(data_reg, buffer, wcount) \ @@ -310,11 +332,11 @@ static __inline__ void ide_release_region (ide_ioreg_t from, unsigned int extent #define D_INT(cnt) (T_INT | (cnt)) #define D_TEXT(cnt) (T_TEXT | (cnt)) -#ifdef CONFIG_AMIGA +#if defined(CONFIG_AMIGA) || defined (CONFIG_MAC) static u_short driveid_types[] = { D_SHORT(10), /* config - vendor2 */ D_TEXT(20), /* serial_no */ - D_SHORT(3), /* buf_type - ecc_bytes */ + D_SHORT(3), /* buf_type, buf_size - ecc_bytes */ D_TEXT(48), /* fw_rev - model */ D_CHAR(2), /* max_multsect - vendor3 */ D_SHORT(1), /* dword_io */ @@ -333,12 +355,12 @@ static u_short driveid_types[] = { static __inline__ void ide_fix_driveid(struct hd_driveid *id) { -#ifdef CONFIG_AMIGA +#if defined(CONFIG_AMIGA) || defined (CONFIG_MAC) u_char *p = (u_char *)id; int i, j, cnt; u_char t; - if (!MACH_IS_AMIGA) + if (!MACH_IS_AMIGA && !MACH_IS_MAC) return; for (i = 0; i < num_driveid_types; i++) { cnt = driveid_types[i] & T_MASK_COUNT; @@ -423,7 +445,7 @@ static __inline__ void ide_get_lock (int *ide_lock, void (*handler)(int, void *, * an interrupt, and in that case it does nothing. Hope that is reasonable and * works. (Roman) */ -#if defined(CONFIG_ATARI) && !defined(CONFIG_AMIGA) +#ifdef CONFIG_ATARI_ONLY #define ide__sti() \ do { \ if (!in_interrupt()) __sti(); \ diff --git a/include/asm-m68k/io.h b/include/asm-m68k/io.h index 8cee601e6..a002fe2a0 100644 --- a/include/asm-m68k/io.h +++ b/include/asm-m68k/io.h @@ -28,9 +28,9 @@ #define readl(addr) \ ({ unsigned int __v = (*(volatile unsigned int *) (addr)); __v; }) -#define writeb(b,addr) ((*(volatile unsigned char *) (addr)) = (b)) -#define writew(b,addr) ((*(volatile unsigned short *) (addr)) = (b)) -#define writel(b,addr) ((*(volatile unsigned int *) (addr)) = (b)) +#define writeb(b,addr) (void)((*(volatile unsigned char *) (addr)) = (b)) +#define writew(b,addr) (void)((*(volatile unsigned short *) (addr)) = (b)) +#define writel(b,addr) (void)((*(volatile unsigned int *) (addr)) = (b)) #define memset_io(a,b,c) memset((void *)(a),(b),(c)) #define memcpy_fromio(a,b,c) memcpy((a),(void *)(b),(c)) diff --git a/include/asm-m68k/keyboard.h b/include/asm-m68k/keyboard.h index cb013200b..c30c8dc04 100644 --- a/include/asm-m68k/keyboard.h +++ b/include/asm-m68k/keyboard.h @@ -24,7 +24,7 @@ static __inline__ int kbd_setkeycode(unsigned int scancode, static __inline__ int kbd_getkeycode(unsigned int scancode) { - return -EOPNOTSUPP; + return scancode > 127 ? -EINVAL : scancode; } static __inline__ int kbd_pretranslate(unsigned char scancode, char raw_mode) diff --git a/include/asm-m68k/kgdb.h b/include/asm-m68k/kgdb.h new file mode 100644 index 000000000..e1d3c493f --- /dev/null +++ b/include/asm-m68k/kgdb.h @@ -0,0 +1,83 @@ +/* + * include/asm-m68k/kgdb.h + * + * Copyright (C) 1996 Roman Hodek + */ + +#ifndef __ASM_M68k_KGDB_H +#define __ASM_M68k_KGDB_H + +/* + * Structure to save all register values in, already in the order gdb wants + * it. Note that the upper half of the SR field is recycled for the FORMAT and + * VECTOR fields. Hope that doesn't confuse gdb... That upper half is ignored + * on exiting the stub, so gdb can modify it as it likes. + */ + +#define GDBREG_A6 14 +#define GDBREG_A7 15 +#define GDBREG_SP 15 +#define GDBREG_SR 16 +#define GDBREG_PC 17 +#define GDBREG_FP0 18 +#define GDBREG_FP7 25 +#define GDBREG_FPCR 26 +#define GDBREG_FPIAR 28 + +#define GDBOFFA_D6 (6*4) +#define GDBOFFA_A3 (11*4) + +#define NUMREGSBYTES 180 + +#ifndef __ASSEMBLY__ + +struct gdb_regs { + long regs[16]; /* d0-a7 */ + unsigned format : 4; /* frame format specifier */ + unsigned vector : 12; /* vector offset */ + unsigned short sr; /* status register */ + unsigned long pc; /* program counter */ + unsigned long fpregs[8*3]; /* fp0-fp7 */ + unsigned long fpcntl[3]; /* fpcr, fpsr, fpiar */ +}; + +extern struct gdb_regs kgdb_registers; +extern void kgdb_init( void ); +struct frame; +extern asmlinkage void enter_kgdb( struct pt_regs *fp ); + +extern int kgdb_initialized; + +/* + * This function will generate a breakpoint exception. It is used at the + * beginning of a program to sync up with a debugger and can be used + * otherwise as a quick means to stop program execution and "break" into + * the debugger. + */ +extern inline void breakpoint( void ) +{ + if (!kgdb_initialized) + /* if kgdb not inited, do nothing */ + return; + + /* breakpoint instruction is TRAP #15 */ + __asm__ __volatile__ ( "trap #15" ); +} + +/* + * This function will report a SIGABORT to gdb. + */ +extern inline void kgdb_abort( void ) +{ + if (!kgdb_initialized) + /* if kgdb not inited, do nothing */ + return; + + /* TRAP #14 is reported as SIGABORT */ + __asm__ __volatile__ ( "trap #14" ); +} + +#endif /* __ASSEMBLY__ */ + +#endif /* __ASM_M68k_KGDB_H */ + diff --git a/include/asm-m68k/linux_logo.h b/include/asm-m68k/linux_logo.h new file mode 100644 index 000000000..e57168b1e --- /dev/null +++ b/include/asm-m68k/linux_logo.h @@ -0,0 +1,46 @@ +/* $Id: linux_logo.h,v 1.1 1997/04/16 17:51:24 jj Exp $ + * include/asm-m68k/linux_logo.h: This is a linux logo + * to be displayed on boot. + * + * Copyright (C) 1996 Larry Ewing (lewing@isc.tamu.edu) + * Copyright (C) 1996 Jakub Jelinek (jj@sunsite.mff.cuni.cz) + * + * You can put anything here, but: + * LINUX_LOGO_COLORS has to be less than 224 + * image size has to be 80x80 + * values have to start from 0x20 + * (i.e. RGB(linux_logo_red[0], + * linux_logo_green[0], + * linux_logo_blue[0]) is color 0x20) + * BW image has to be 80x80 as well, with MS bit + * on the left + * Serial_console ascii image can be any size, + * but should contain %s to display the version + */ + +#include <linux/init.h> +#include <linux/version.h> + +#define linux_logo_banner "Linux/m68k version " UTS_RELEASE + +#define LINUX_LOGO_COLORS 221 + +#ifdef INCLUDE_LINUX_LOGO_DATA + +#define INCLUDE_LINUX_LOGO16 +#include <linux/linux_logo.h> + +#else + +/* prototypes only */ +extern unsigned char linux_logo_red[]; +extern unsigned char linux_logo_green[]; +extern unsigned char linux_logo_blue[]; +extern unsigned char linux_logo[]; +extern unsigned char linux_logo_bw[]; +extern unsigned char linux_logo16_red[]; +extern unsigned char linux_logo16_green[]; +extern unsigned char linux_logo16_blue[]; +extern unsigned char linux_logo16[]; + +#endif diff --git a/include/asm-m68k/machdep.h b/include/asm-m68k/machdep.h index b5be7c65d..5e2b138e9 100644 --- a/include/asm-m68k/machdep.h +++ b/include/asm-m68k/machdep.h @@ -13,6 +13,7 @@ extern void (*mach_sched_init) (void (*handler)(int, void *, struct pt_regs *)); extern int (*mach_keyb_init) (void); extern int (*mach_kbdrate) (struct kbd_repeat *); extern void (*mach_kbd_leds) (unsigned int); +extern void (*kbd_reset_setup) (char *, int); /* machine dependent irq functions */ extern void (*mach_init_IRQ) (void); extern void (*(*mach_default_handler)[]) (int, void *, struct pt_regs *); diff --git a/include/asm-m68k/machw.h b/include/asm-m68k/machw.h index 4012d8111..90ff6b627 100644 --- a/include/asm-m68k/machw.h +++ b/include/asm-m68k/machw.h @@ -99,10 +99,48 @@ struct VIA # define via_1 ((*(volatile struct VIA *)VIA1_BAS)) # define via_2 ((*(volatile struct VIA *)VIA2_BAS)) -# define via1_regp ((volatile unsigned char *)VIA1_BAS) - -# define via2_regp ((volatile unsigned char *)VIA2_BAS) -# define via2_ci_regp ((volatile unsigned char *)VIA2_BAS_IIci) -# define rbv_regp ((volatile unsigned char *)VIA2_BAS_IIci) +# define via1_regp ((volatile unsigned char *)VIA1_BAS) +/* + * OSS/RBV base address + */ + +#define OSS_BAS 0x50f1a000 +#define PSC_BAS 0x50f31000 + +/* move to oss.h?? */ +#define nIFR 0x203 +#define oIFR 0x202 + + +/* hardware stuff */ + +#define MACHW_DECLARE(name) unsigned name : 1 +#define MACHW_SET(name) (mac_hw_present.name = 1) +#define MACHW_PRESENT(name) (mac_hw_present.name) + +struct { + /* video hardware */ + /* sound hardware */ + /* disk storage interfaces */ + MACHW_DECLARE(MAC_SCSI_80); /* Directly mapped NCR5380 */ + MACHW_DECLARE(MAC_SCSI_96); /* 53c9[46] */ + MACHW_DECLARE(MAC_SCSI_96_2); /* 2nd 53c9[46] Q900 and Q950 */ + MACHW_DECLARE(IDE); /* IDE Interface */ + /* other I/O hardware */ + MACHW_DECLARE(SCC); /* Serial Communications Contr. */ + /* DMA */ + MACHW_DECLARE(SCSI_DMA); /* DMA for the NCR5380 */ + /* real time clocks */ + MACHW_DECLARE(RTC_CLK); /* clock chip */ + /* supporting hardware */ + MACHW_DECLARE(VIA1); /* Versatile Interface Ad. 1 */ + MACHW_DECLARE(VIA2); /* Versatile Interface Ad. 2 */ + MACHW_DECLARE(RBV); /* Versatile Interface Ad. 2+ */ + /* NUBUS */ + MACHW_DECLARE(NUBUS); /* NUBUS */ +} mac_hw_present; + +/* extern struct mac_hw_present mac_hw_present; */ + #endif /* linux/machw.h */ diff --git a/include/asm-m68k/macintosh.h b/include/asm-m68k/macintosh.h index f40ff86c5..a084447f5 100644 --- a/include/asm-m68k/macintosh.h +++ b/include/asm-m68k/macintosh.h @@ -56,6 +56,8 @@ struct mac_model #define MAC_ADB_II 1 #define MAC_ADB_IISI 2 #define MAC_ADB_CUDA 3 +#define MAC_ADB_PB1 4 +#define MAC_ADB_PB2 5 #define MAC_VIA_II 1 #define MAC_VIA_IIci 2 @@ -74,6 +76,7 @@ struct mac_model #define MAC_SCC_II 1 #define MAC_SCC_QUADRA 2 #define MAC_SCC_QUADRA2 3 +#define MAC_SCC_IOP 4 #define MAC_ETHER_NONE 0 #define MAC_ETHER_SONIC 1 @@ -92,8 +95,9 @@ struct mac_model #define MAC_MODEL_IICI 11 #define MAC_MODEL_IIFX 13 /* And well numbered it is too */ #define MAC_MODEL_IISI 18 +#define MAC_MODEL_LC 19 #define MAC_MODEL_Q900 20 -#define MAC_MODEL_PB170 25 +#define MAC_MODEL_PB170 21 #define MAC_MODEL_Q700 22 #define MAC_MODEL_CLII 23 #define MAC_MODEL_PB140 25 @@ -109,6 +113,7 @@ struct mac_model #define MAC_MODEL_LCII 37 /* aka: P400/405/410/430 */ #define MAC_MODEL_PB250 38 #define MAC_MODEL_IIVI 44 +#define MAC_MODEL_P600 45 #define MAC_MODEL_IIVX 48 #define MAC_MODEL_CCL 49 #define MAC_MODEL_PB165C 50 @@ -123,13 +128,16 @@ struct mac_model #define MAC_MODEL_PB270C 77 #define MAC_MODEL_Q840 78 #define MAC_MODEL_P550 80 +#define MAC_MODEL_CCLII 83 #define MAC_MODEL_PB165 84 #define MAC_MODEL_PB190 85 #define MAC_MODEL_TV 88 #define MAC_MODEL_P475 89 /* aka: LC475, P476 */ +#define MAC_MODEL_P475F 90 /* aka: P475 w/ FPU (no LC040) */ #define MAC_MODEL_P575 92 /* aka: LC575/580, P577/578/508 */ #define MAC_MODEL_Q605 94 #define MAC_MODEL_Q630 98 /* aka: LC630, P630/631/636/640 */ +#define MAC_MODEL_P588 99 /* aka: ?? */ #define MAC_MODEL_PB280 102 #define MAC_MODEL_PB280C 103 #define MAC_MODEL_PB150 115 diff --git a/include/asm-m68k/macints.h b/include/asm-m68k/macints.h index b2522f78d..e731c0e7f 100644 --- a/include/asm-m68k/macints.h +++ b/include/asm-m68k/macints.h @@ -26,9 +26,9 @@ #define VIA1_SOURCE_BASE 8 #define VIA2_SOURCE_BASE 16 -#define RBF_SOURCE_BASE 24 +#define RBV_SOURCE_BASE 24 #define MAC_SCC_SOURCE_BASE 32 -#define NUBUS_SOURCE_BASE 40 +#define NUBUS_SOURCE_BASE 56 #define NUBUS_MAX_SOURCES 8 /* FIXME: sources not contigous ... */ @@ -42,14 +42,6 @@ */ #define IRQ_IDX(irq) (irq) -#if 0 -/* convert vector number to int source number */ -#define IRQ_VECTOR_TO_SOURCE(v) (v) - -/* convert irq_handler index to vector number */ -#define IRQ_SOURCE_TO_VECTOR(i) (i) -#endif - /* interrupt service types */ #define IRQ_TYPE_SLOW 0 #define IRQ_TYPE_FAST 1 @@ -96,6 +88,7 @@ #define IRQ_VIA2_6 (22) #define IRQ_VIA2_7 (23) +#if 0 /* RBV interrupts */ #define IRQ_RBV_0 (24) #define IRQ_RBV_1 (25) @@ -105,10 +98,19 @@ #define IRQ_RBV_5 (29) #define IRQ_RBV_6 (30) #define IRQ_RBV_7 (31) +#endif + +/* Level 3 (PSC, AV Macs only) interrupts */ +#define IRQ_PSC3_0 (24) +#define IRQ_MAC_MACE IRQ_PSC3_0 +#define IRQ_PSC3_1 (25) +#define IRQ_PSC3_2 (26) +#define IRQ_PSC3_3 (27) +/* Level 4 (SCC) interrupts */ #define IRQ_SCC (32) -#define IRQ_SCCB (32) -#define IRQ_SCCA (33) +#define IRQ_SCCB (33) +#define IRQ_SCCA (34) #if 0 /* FIXME: are there multiple interrupt conditions on the SCC ?? */ /* SCC interrupts */ #define IRQ_SCCB_TX (32) @@ -121,7 +123,27 @@ #define IRQ_SCCA_SPCOND (39) #endif -#define IRQ_NUBUS_1 (40) +/* Level 4 (PSC, AV Macs only) interrupts */ +#define IRQ_PSC4_0 (32) +#define IRQ_PSC4_1 (33) +#define IRQ_PSC4_2 (34) +#define IRQ_PSC4_3 (35) +#define IRQ_MAC_MACE_DMA IRQ_PSC4_3 + +/* Level 5 (PSC, AV Macs only) interrupts */ +#define IRQ_PSC5_0 (40) +#define IRQ_PSC5_1 (41) +#define IRQ_PSC5_2 (42) +#define IRQ_PSC5_3 (43) + +/* Level 6 (PSC, AV Macs only) interrupts */ +#define IRQ_PSC6_0 (48) +#define IRQ_PSC6_1 (49) +#define IRQ_PSC6_2 (50) +#define IRQ_PSC6_3 (51) + +/* Nubus interrupts (cascaded to VIA2) */ +#define IRQ_NUBUS_1 (56) #define INT_CLK 24576 /* CLK while int_clk =2.456MHz and divide = 100 */ #define INT_TICKS 246 /* to make sched_time = 99.902... HZ */ @@ -143,7 +165,7 @@ void mac_turnon_irq( unsigned irq ); void mac_turnoff_irq( unsigned irq ); void mac_clear_pending_irq( unsigned irq ); int mac_irq_pending( unsigned irq ); -int nubus_request_irq(int slot, void (*handler)(int,void *,struct pt_regs *)); +int nubus_request_irq(int slot, void *dev_id, void (*handler)(int,void *,struct pt_regs *)); int nubus_free_irq(int slot); unsigned long mac_register_nubus_int( void ); diff --git a/include/asm-m68k/md.h b/include/asm-m68k/md.h new file mode 100644 index 000000000..1d15aae21 --- /dev/null +++ b/include/asm-m68k/md.h @@ -0,0 +1,13 @@ +/* $Id: md.h,v 1.1 1997/12/15 15:12:04 jj Exp $ + * md.h: High speed xor_block operation for RAID4/5 + * + */ + +#ifndef __ASM_MD_H +#define __ASM_MD_H + +/* #define HAVE_ARCH_XORBLOCK */ + +#define MD_XORBLOCK_ALIGNMENT sizeof(long) + +#endif /* __ASM_MD_H */ diff --git a/include/asm-m68k/mvme16xhw.h b/include/asm-m68k/mvme16xhw.h index dbcee2672..75a21d8a4 100644 --- a/include/asm-m68k/mvme16xhw.h +++ b/include/asm-m68k/mvme16xhw.h @@ -34,37 +34,59 @@ typedef struct { spare3, spare4, data; -} lpr_ctrl; +} MVMElp, *MVMElpPtr; -#define LPR_REGS ((volatile lpr_ctrl *)0xfff42030) +#define MVME_LPR_BASE 0xfff42030 -#define I596_BASE 0xfff46000 +#define mvmelp ((*(volatile MVMElpPtr)(MVME_LPR_BASE))) -#define SCC_A_ADDR 0xfff45005 -#define SCC_B_ADDR 0xfff45001 - -#define IRQ_MVME162_TYPE_PRIO 0 - -#define IRQ_MVME167_PRN 0x54 -#define IRQ_MVME16x_I596 0x57 -#define IRQ_MVME16x_SCSI 0x55 -#define IRQ_MVME16x_FLY 0x7f -#define IRQ_MVME167_SER_ERR 0x5c -#define IRQ_MVME167_SER_MODEM 0x5d -#define IRQ_MVME167_SER_TX 0x5e -#define IRQ_MVME167_SER_RX 0x5f -#define IRQ_MVME16x_TIMER 0x59 +typedef struct { + unsigned char + ctrl, + bcd_sec, + bcd_min, + bcd_hr, + bcd_dow, + bcd_dom, + bcd_mth, + bcd_year; +} MK48T08_t, *MK48T08ptr_t; + +#define RTC_WRITE 0x80 +#define RTC_READ 0x40 +#define RTC_STOP 0x20 + +#define MVME_RTC_BASE 0xfffc1ff8 + +#define MVME_I596_BASE 0xfff46000 + +#define MVME_SCC_A_ADDR 0xfff45005 +#define MVME_SCC_B_ADDR 0xfff45001 + +#define MVME162_IRQ_TYPE_PRIO 0 + +#define MVME167_IRQ_PRN 0x54 +#define MVME16x_IRQ_I596 0x57 +#define MVME16x_IRQ_SCSI 0x55 +#define MVME16x_IRQ_FLY 0x7f +#define MVME167_IRQ_SER_ERR 0x5c +#define MVME167_IRQ_SER_MODEM 0x5d +#define MVME167_IRQ_SER_TX 0x5e +#define MVME167_IRQ_SER_RX 0x5f +#define MVME16x_IRQ_TIMER 0x59 +#define MVME167_IRQ_ABORT 0x6e +#define MVME162_IRQ_ABORT 0x5e /* SCC interrupts, for MVME162 */ -#define IRQ_MVME162_SCC_BASE 0x40 -#define IRQ_MVME162_SCCB_TX 0x40 -#define IRQ_MVME162_SCCB_STAT 0x42 -#define IRQ_MVME162_SCCB_RX 0x44 -#define IRQ_MVME162_SCCB_SPCOND 0x46 -#define IRQ_MVME162_SCCA_TX 0x48 -#define IRQ_MVME162_SCCA_STAT 0x4a -#define IRQ_MVME162_SCCA_RX 0x4c -#define IRQ_MVME162_SCCA_SPCOND 0x4e +#define MVME162_IRQ_SCC_BASE 0x40 +#define MVME162_IRQ_SCCB_TX 0x40 +#define MVME162_IRQ_SCCB_STAT 0x42 +#define MVME162_IRQ_SCCB_RX 0x44 +#define MVME162_IRQ_SCCB_SPCOND 0x46 +#define MVME162_IRQ_SCCA_TX 0x48 +#define MVME162_IRQ_SCCA_STAT 0x4a +#define MVME162_IRQ_SCCA_RX 0x4c +#define MVME162_IRQ_SCCA_SPCOND 0x4e /* MVME162 version register */ @@ -85,34 +107,4 @@ extern unsigned short mvme16x_config; #define MVME16x_CONFIG_GOT_SCCA 0x0400 #define MVME16x_CONFIG_GOT_SCCB 0x0800 -/* Specials for the ethernet driver */ - -#define CA() (((struct i596_reg *)dev->base_addr)->ca = 1) - -#define MPU_PORT(c,x) \ - ((struct i596_reg *)(dev->base_addr))->porthi = ((c) | (u32)(x)) & 0xffff; \ - ((struct i596_reg *)(dev->base_addr))->portlo = ((c) | (u32)(x)) >> 16 - -#define SCP_SYSBUS 0x00000054 - -#define WSWAPrfd(x) ((struct i596_rfd *) (((u32)(x)<<16) | ((((u32)(x)))>>16))) -#define WSWAPrbd(x) ((struct i596_rbd *) (((u32)(x)<<16) | ((((u32)(x)))>>16))) -#define WSWAPiscp(x) ((struct i596_iscp *)(((u32)(x)<<16) | ((((u32)(x)))>>16))) -#define WSWAPscb(x) ((struct i596_scb *) (((u32)(x)<<16) | ((((u32)(x)))>>16))) -#define WSWAPcmd(x) ((struct i596_cmd *) (((u32)(x)<<16) | ((((u32)(x)))>>16))) -#define WSWAPtbd(x) ((struct i596_tbd *) (((u32)(x)<<16) | ((((u32)(x)))>>16))) -#define WSWAPchar(x) ((char *) (((u32)(x)<<16) | ((((u32)(x)))>>16))) - -/* - * The MPU_PORT command allows direct access to the 82596. With PORT access - * the following commands are available (p5-18). The 32-bit port command - * must be word-swapped with the most significant word written first. - */ -#define PORT_RESET 0x00 /* reset 82596 */ -#define PORT_SELFTEST 0x01 /* selftest */ -#define PORT_ALTSCP 0x02 /* alternate SCB address */ -#define PORT_ALTDUMP 0x03 /* Alternate DUMP address */ - -#define ISCP_BUSY 0x00010000 - -#endif /* _M68K_MVME16xHW_H_ */ +#endif diff --git a/include/asm-m68k/page.h b/include/asm-m68k/page.h index d8d0beafe..f9f50bff7 100644 --- a/include/asm-m68k/page.h +++ b/include/asm-m68k/page.h @@ -12,6 +12,9 @@ #define STRICT_MM_TYPECHECKS +#define get_user_page(vaddr) __get_free_page(GFP_KERNEL) +#define free_user_page(page, addr) free_page(addr) + /* * We don't need to check for alignment etc. */ diff --git a/include/asm-m68k/pgtable.h b/include/asm-m68k/pgtable.h index d20bc6144..d49f985bf 100644 --- a/include/asm-m68k/pgtable.h +++ b/include/asm-m68k/pgtable.h @@ -1,9 +1,12 @@ #ifndef _M68K_PGTABLE_H #define _M68K_PGTABLE_H +#include <linux/config.h> #include <asm/setup.h> #ifndef __ASSEMBLY__ +#include <asm/processor.h> +#include <linux/tasks.h> /* * This file contains the functions and defines necessary to modify and use @@ -263,6 +266,7 @@ extern inline void flush_tlb_kernel_page(unsigned long addr) #define PTRS_PER_PTE 1024 #define PTRS_PER_PMD 8 #define PTRS_PER_PGD 128 +#define USER_PTRS_PER_PGD (TASK_SIZE/PGDIR_SIZE) /* the no. of pointers that fit on a page: this will go away */ #define PTRS_PER_PAGE (PAGE_SIZE/sizeof(void*)) @@ -279,6 +283,10 @@ typedef pgd_table pgd_tablepage[PGD_TABLES_PER_PAGE]; typedef pmd_table pmd_tablepage[PMD_TABLES_PER_PAGE]; typedef pte_table pte_tablepage[PTE_TABLES_PER_PAGE]; +/* Virtual address region for use by kernel_map() */ +#define KMAP_START 0xd0000000 +#define KMAP_END 0xf0000000 + /* Just any arbitrary offset to the start of the vmalloc VM area: the * current 8MB value just means that there will be a 8MB "hole" after the * physical memory until the kernel virtual memory starts. That means that @@ -289,6 +297,7 @@ typedef pte_table pte_tablepage[PTE_TABLES_PER_PAGE]; #define VMALLOC_OFFSET (8*1024*1024) #define VMALLOC_START (((unsigned long) high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)) #define VMALLOC_VMADDR(x) ((unsigned long)(x)) +#define VMALLOC_END KMAP_START #endif /* __ASSEMBLY__ */ @@ -325,6 +334,16 @@ typedef pte_table pte_tablepage[PTE_TABLES_PER_PAGE]; * and initialized in head.S */ extern int m68k_pgtable_cachemode; +/* This is the cache mode for normal pages, for supervisor access on + * processors >= '040. It is used in pte_mkcache(), and the variable is + * defined and initialized in head.S */ + +#if defined(CONFIG_060_WRITETHROUGH) +extern int m68k_supervisor_cachemode; +#else +#define m68k_supervisor_cachemode _PAGE_CACHE040 +#endif + #if defined(CPU_M68040_OR_M68060_ONLY) #define mm_cachebits _PAGE_CACHE040 #elif defined(CPU_M68020_OR_M68030_ONLY) @@ -492,7 +511,7 @@ extern inline pte_t pte_mknocache(pte_t pte) pte_val(pte) = (pte_val(pte) & _CACHEMASK040) | m68k_pgtable_cachemode; return pte; } -extern inline pte_t pte_mkcache(pte_t pte) { pte_val(pte) = (pte_val(pte) & _CACHEMASK040) | _PAGE_CACHE040; return pte; } +extern inline pte_t pte_mkcache(pte_t pte) { pte_val(pte) = (pte_val(pte) & _CACHEMASK040) | m68k_supervisor_cachemode; return pte; } /* to set the page-dir */ extern inline void SET_PAGE_DIR(struct task_struct * tsk, pgd_t * pgdir) @@ -584,73 +603,137 @@ static inline void cache_page (unsigned long vaddr) } } +extern struct pgtable_cache_struct { + unsigned long *pmd_cache; + unsigned long *pte_cache; +/* This counts in units of pointer tables, of which can be eight per page. */ + unsigned long pgtable_cache_sz; +} quicklists; -extern const char PgtabStr_bad_pmd[]; -extern const char PgtabStr_bad_pgd[]; -extern const char PgtabStr_bad_pmdk[]; -extern const char PgtabStr_bad_pgdk[]; +#define pgd_quicklist ((unsigned long *)0) +#define pmd_quicklist (quicklists.pmd_cache) +#define pte_quicklist (quicklists.pte_cache) +/* This isn't accurate because of fragmentation of allocated pages for + pointer tables, but that should not be a problem. */ +#define pgtable_cache_size ((quicklists.pgtable_cache_sz+7)/8) -extern inline void pte_free(pte_t * pte) +extern pte_t *get_pte_slow(pmd_t *pmd, unsigned long offset); +extern pmd_t *get_pmd_slow(pgd_t *pgd, unsigned long offset); + +extern pmd_t *get_pointer_table(void); +extern int free_pointer_table(pmd_t *); +extern pmd_t *get_kpointer_table(void); +extern void free_kpointer_table(pmd_t *); + +extern __inline__ pte_t *get_pte_fast(void) +{ + unsigned long *ret; + + ret = pte_quicklist; + if (ret) { + pte_quicklist = (unsigned long *)*ret; + ret[0] = ret[1]; + quicklists.pgtable_cache_sz -= 8; + } + return (pte_t *)ret; +} + +extern __inline__ void free_pte_fast(pte_t *pte) +{ + *(unsigned long *)pte = (unsigned long)pte_quicklist; + pte_quicklist = (unsigned long *)pte; + quicklists.pgtable_cache_sz += 8; +} + +extern __inline__ void free_pte_slow(pte_t *pte) { cache_page((unsigned long)pte); free_page((unsigned long) pte); } +extern __inline__ pmd_t *get_pmd_fast(void) +{ + unsigned long *ret; + + ret = pmd_quicklist; + if (ret) { + pmd_quicklist = (unsigned long *)*ret; + ret[0] = ret[1]; + quicklists.pgtable_cache_sz--; + } + return (pmd_t *)ret; +} + +extern __inline__ void free_pmd_fast(pmd_t *pmd) +{ + *(unsigned long *)pmd = (unsigned long)pmd_quicklist; + pmd_quicklist = (unsigned long *) pmd; + quicklists.pgtable_cache_sz++; +} + +extern __inline__ int free_pmd_slow(pmd_t *pmd) +{ + return free_pointer_table(pmd); +} + +/* The pgd cache is folded into the pmd cache, so these are dummy routines. */ +extern __inline__ pgd_t *get_pgd_fast(void) +{ + return (pgd_t *)0; +} + +extern __inline__ void free_pgd_fast(pgd_t *pgd) +{ +} + +extern __inline__ void free_pgd_slow(pgd_t *pgd) +{ +} + +extern void __bad_pte(pmd_t *pmd); +extern void __bad_pmd(pgd_t *pgd); + +extern inline void pte_free(pte_t * pte) +{ + free_pte_fast(pte); +} + extern inline pte_t * pte_alloc(pmd_t * pmd, unsigned long address) { address = (address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1); if (pmd_none(*pmd)) { - pte_t * page = (pte_t *)__get_free_page(GFP_KERNEL); - if (pmd_none(*pmd)) { - if (page) { - memset((void *) page, 0, PAGE_SIZE); - flush_page_to_ram((unsigned long)page); - flush_tlb_kernel_page((unsigned long)page); - nocache_page((unsigned long)page); - pmd_set(pmd,page); - return page + address; - } - pmd_set(pmd, BAD_PAGETABLE); - return NULL; - } - free_page((unsigned long)page); + pte_t * page = get_pte_fast(); + + if (!page) + return get_pte_slow(pmd, address); + pmd_set(pmd,page); + return page + address; } if (pmd_bad(*pmd)) { - printk(PgtabStr_bad_pmd, pmd_val(*pmd)); - pmd_set(pmd, BAD_PAGETABLE); + __bad_pte(pmd); return NULL; } return (pte_t *) pmd_page(*pmd) + address; } -extern pmd_t *get_pointer_table (void); -extern void free_pointer_table (pmd_t *); -extern pmd_t *get_kpointer_table (void); -extern void free_kpointer_table (pmd_t *); - extern inline void pmd_free(pmd_t * pmd) { - free_pointer_table (pmd); + free_pmd_fast(pmd); } extern inline pmd_t * pmd_alloc(pgd_t * pgd, unsigned long address) { address = (address >> PMD_SHIFT) & (PTRS_PER_PMD - 1); if (pgd_none(*pgd)) { - pmd_t *page = get_pointer_table(); - if (pgd_none(*pgd)) { - if (page) { - pgd_set(pgd, page); - return page + address; - } - pgd_set(pgd, (pmd_t *)BAD_PAGETABLE); - return NULL; - } - free_pointer_table(page); + pmd_t *page = get_pmd_fast(); + + if (!page) + return get_pmd_slow(pgd, address); + pgd_set(pgd, page); + return page + address; } if (pgd_bad(*pgd)) { - printk(PgtabStr_bad_pgd, pgd_val(*pgd)); - pgd_set(pgd, (pmd_t *)BAD_PAGETABLE); + __bad_pmd(pgd); return NULL; } return (pmd_t *) pgd_page(*pgd) + address; @@ -658,33 +741,12 @@ extern inline pmd_t * pmd_alloc(pgd_t * pgd, unsigned long address) extern inline void pte_free_kernel(pte_t * pte) { - cache_page((unsigned long)pte); - free_page((unsigned long) pte); + free_pte_fast(pte); } extern inline pte_t * pte_alloc_kernel(pmd_t * pmd, unsigned long address) { - address = (address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1); - if (pmd_none(*pmd)) { - pte_t * page = (pte_t *) get_free_page(GFP_KERNEL); - if (pmd_none(*pmd)) { - if (page) { - flush_tlb_kernel_page((unsigned long)page); - nocache_page((unsigned long)page); - pmd_set(pmd, page); - return page + address; - } - pmd_set(pmd, BAD_PAGETABLE); - return NULL; - } - free_page((unsigned long) page); - } - if (pmd_bad(*pmd)) { - printk(PgtabStr_bad_pmdk, pmd_val(*pmd)); - pmd_set(pmd, BAD_PAGETABLE); - return NULL; - } - return (pte_t *) pmd_page(*pmd) + address; + return pte_alloc(pmd, address); } extern inline void pmd_free_kernel(pmd_t * pmd) @@ -708,8 +770,7 @@ extern inline pmd_t * pmd_alloc_kernel(pgd_t * pgd, unsigned long address) free_kpointer_table(page); } if (pgd_bad(*pgd)) { - printk(PgtabStr_bad_pgdk, pgd_val(*pgd)); - pgd_set(pgd, (pmd_t *)BAD_PAGETABLE); + __bad_pmd(pgd); return NULL; } return (pmd_t *) pgd_page(*pgd) + address; @@ -717,12 +778,21 @@ extern inline pmd_t * pmd_alloc_kernel(pgd_t * pgd, unsigned long address) extern inline void pgd_free(pgd_t * pgd) { - free_pointer_table ((pmd_t *) pgd); + free_pmd_fast((pmd_t *)pgd); } extern inline pgd_t * pgd_alloc(void) { - return (pgd_t *)get_pointer_table (); + pgd_t *pgd = (pgd_t *)get_pmd_fast(); + if (!pgd) + pgd = (pgd_t *)get_pointer_table(); + return pgd; +} + +extern int do_check_pgt_cache(int, int); + +extern inline void set_pgdir(unsigned long address, pgd_t entry) +{ } /* @@ -782,4 +852,7 @@ extern inline void update_mmu_cache(struct vm_area_struct * vma, #define module_map vmalloc #define module_unmap vfree +/* Needs to be defined here and not in linux/mm.h, as it is arch dependent */ +#define PageSkip(page) (0) + #endif /* _M68K_PGTABLE_H */ diff --git a/include/asm-m68k/posix_types.h b/include/asm-m68k/posix_types.h index 33c423980..460de0b30 100644 --- a/include/asm-m68k/posix_types.h +++ b/include/asm-m68k/posix_types.h @@ -37,6 +37,8 @@ typedef struct { #endif /* !defined(__KERNEL__) && !defined(__USE_ALL) */ } __kernel_fsid_t; +#if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) + #undef __FD_SET #define __FD_SET(d, set) ((set)->fds_bits[__FDELT(d)] |= __FDMASK(d)) @@ -49,4 +51,6 @@ typedef struct { #undef __FD_ZERO #define __FD_ZERO(fdsetp) (memset (fdsetp, 0, sizeof(*(fd_set *)fdsetp))) +#endif /* defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) */ + #endif diff --git a/include/asm-m68k/processor.h b/include/asm-m68k/processor.h index 6d04e36d0..8246efd95 100644 --- a/include/asm-m68k/processor.h +++ b/include/asm-m68k/processor.h @@ -20,6 +20,7 @@ * space during mmap's. */ #define TASK_UNMAPPED_BASE 0xC0000000UL +#define TASK_UNMAPPED_ALIGN(addr, off) PAGE_ALIGN(addr) /* * Bus types @@ -71,6 +72,9 @@ static inline void release_thread(struct task_struct *dead_task) { } +#define copy_segments(nr, tsk, mm) do { } while (0) +#define release_segments(mm) do { } while (0) + /* * Free current thread data structures etc.. */ @@ -83,12 +87,12 @@ static inline void exit_thread(void) */ extern inline unsigned long thread_saved_pc(struct thread_struct *t) { - extern int sys_pause(void); - extern void schedule(void); + extern void scheduling_functions_start_here(void); + extern void scheduling_functions_end_here(void); struct switch_stack *sw = (struct switch_stack *)t->ksp; /* Check whether the thread is blocked in resume() */ - if (sw->retpc >= (unsigned long)schedule && - sw->retpc < (unsigned long)sys_pause) + if (sw->retpc > (unsigned long)scheduling_functions_start_here && + sw->retpc < (unsigned long)scheduling_functions_end_here) return ((unsigned long *)sw->a6)[1]; else return sw->retpc; diff --git a/include/asm-m68k/serial.h b/include/asm-m68k/serial.h index bc30f6e56..191c5d551 100644 --- a/include/asm-m68k/serial.h +++ b/include/asm-m68k/serial.h @@ -34,6 +34,8 @@ #define SER_WHIPPET 108 /* Amiga Hisoft Whippet PCMCIA (16c550B) */ #define SER_SCC_MVME 109 /* MVME162/MVME172 ports */ #define SER_SCC_MAC 110 /* Macintosh SCC channel */ +#define SER_HPDCA 111 /* HP DCA serial */ +#define SER_SCC_BVME 112 /* BVME6000 ports */ struct serial_struct { int type; diff --git a/include/asm-m68k/setup.h b/include/asm-m68k/setup.h index 16cd23c12..a3084e04d 100644 --- a/include/asm-m68k/setup.h +++ b/include/asm-m68k/setup.h @@ -38,6 +38,7 @@ #define MACH_MVME147 6 #define MACH_MVME16x 7 #define MACH_BVME6000 8 +#define MACH_HP300 9 #ifdef __KERNEL__ @@ -48,10 +49,10 @@ extern u_long m68k_machtype; #if !defined(CONFIG_AMIGA) # define MACH_IS_AMIGA (0) #elif defined(CONFIG_ATARI) || defined(CONFIG_MAC) || defined(CONFIG_APOLLO) \ - || defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000) + || defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000) || defined(CONFIG_HP300) # define MACH_IS_AMIGA (m68k_machtype == MACH_AMIGA) #else -# define MACH_AMIGA_ONLY +# define CONFIG_AMIGA_ONLY # define MACH_IS_AMIGA (1) # define MACH_TYPE (MACH_AMIGA) #endif @@ -59,17 +60,18 @@ extern u_long m68k_machtype; #if !defined(CONFIG_ATARI) # define MACH_IS_ATARI (0) #elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_APOLLO) \ - || defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000) + || defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000) || defined(CONFIG_HP300) # define MACH_IS_ATARI (m68k_machtype == MACH_ATARI) #else -# define MACH_ATARI_ONLY +# define CONFIG_ATARI_ONLY # define MACH_IS_ATARI (1) # define MACH_TYPE (MACH_ATARI) #endif #if !defined(CONFIG_MAC) # define MACH_IS_MAC (0) -#elif defined(CONFIG_AMIGA) || defined(CONFIG_ATARI) || defined(CONFIG_APOLLO) +#elif defined(CONFIG_AMIGA) || defined(CONFIG_ATARI) || defined(CONFIG_APOLLO) \ + || defined(CONFIG_HP300) || defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000) # define MACH_IS_MAC (m68k_machtype == MACH_MAC) #else # define CONFIG_MAC_ONLY @@ -86,7 +88,7 @@ extern u_long m68k_machtype; #if !defined (CONFIG_APOLLO) # define MACH_IS_APOLLO (0) #elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \ - || defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000) + || defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000) || defined(CONFIG_HP300) # define MACH_IS_APOLLO (m68k_machtype == MACH_APOLLO) #else # define CONFIG_APOLLO_ONLY @@ -97,7 +99,7 @@ extern u_long m68k_machtype; #if !defined (CONFIG_MVME16x) # define MACH_IS_MVME16x (0) #elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \ - || defined(CONFIG_APOLLO) || defined(CONFIG_BVME6000) + || defined(CONFIG_APOLLO) || defined(CONFIG_BVME6000) || defined(CONFIG_HP300) # define MACH_IS_MVME16x (m68k_machtype == MACH_MVME16x) #else # define CONFIG_MVME16x_ONLY @@ -108,7 +110,7 @@ extern u_long m68k_machtype; #if !defined (CONFIG_BVME6000) # define MACH_IS_BVME6000 (0) #elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \ - || defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x) + || defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x) || defined(CONFIG_HP300) # define MACH_IS_BVME6000 (m68k_machtype == MACH_BVME6000) #else # define CONFIG_BVME6000_ONLY @@ -116,6 +118,16 @@ extern u_long m68k_machtype; # define MACH_TYPE (MACH_BVME6000) #endif +#if !defined (CONFIG_HP300) +# define MACH_IS_HP300 (0) +#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \ + || defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000) +# define MAC_IS_HP300 (m68k_machtype == MACH_HP300) +#else +# define CONFIG_HP300_ONLY +# define MACH_IS_HP300 (1) +# define MACH_TYPE (MACH_HP300) +#endif #ifndef MACH_TYPE # define MACH_TYPE (m68k_machtype) diff --git a/include/asm-m68k/siginfo.h b/include/asm-m68k/siginfo.h index e53589ef9..f6799d2b1 100644 --- a/include/asm-m68k/siginfo.h +++ b/include/asm-m68k/siginfo.h @@ -43,6 +43,7 @@ typedef struct siginfo { /* SIGCHLD */ struct { pid_t _pid; /* which child */ + uid_t _uid; /* sender's uid */ int _status; /* exit code */ clock_t _utime; clock_t _stime; diff --git a/include/asm-m68k/signal.h b/include/asm-m68k/signal.h index 5fa3fa67e..3524a0bf3 100644 --- a/include/asm-m68k/signal.h +++ b/include/asm-m68k/signal.h @@ -72,8 +72,7 @@ typedef unsigned long sigset_t; /* * SA_FLAGS values: * - * SA_ONSTACK is not currently supported, but will allow sigaltstack(2). - * (++roman: SA_ONSTACK is supported on m68k) + * SA_ONSTACK indicates that a registered stack_t will be used. * SA_INTERRUPT is a no-op, but left due to historical reasons. Use the * SA_RESTART flag to get restarting signals (which were the default long ago) * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. @@ -96,6 +95,15 @@ typedef unsigned long sigset_t; #define SA_ONESHOT SA_RESETHAND #define SA_INTERRUPT 0x20000000 /* dummy -- ignored */ +/* + * sigaltstack controls + */ +#define SS_ONSTACK 1 +#define SS_DISABLE 2 + +#define MINSIGSTKSZ 2048 +#define SIGSTKSZ 8192 + #ifdef __KERNEL__ /* * These values of sa_flags are used only by the kernel as part of the @@ -142,11 +150,18 @@ struct k_sigaction { /* Here we must cater to libcs that poke about in kernel headers. */ struct sigaction { - __sighandler_t sa_handler; + union { + __sighandler_t _sa_handler; + void (*_sa_sigaction)(int, struct siginfo *, void *); + } _u; sigset_t sa_mask; unsigned long sa_flags; void (*sa_restorer)(void); }; + +#define sa_handler _u._sa_handler +#define sa_sigaction _u._sa_sigaction + #endif /* __KERNEL__ */ typedef struct sigaltstack { diff --git a/include/asm-m68k/smp_lock.h b/include/asm-m68k/smp_lock.h deleted file mode 100644 index 6bc9a781b..000000000 --- a/include/asm-m68k/smp_lock.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef __M68K_SMPLOCK_H -#define __M68K_SMPLOCK_H - -/* - * We don't do SMP so this is again one of these silly dummy files - * to keep the kernel source looking nice ;-(. - */ - -#define lock_kernel() do { } while(0) -#define unlock_kernel() do { } while(0) -#define release_kernel_lock(task, cpu, depth) ((depth) = 1) -#define reacquire_kernel_lock(task, cpu, depth) do { } while(0) - -#endif diff --git a/include/asm-m68k/smplock.h b/include/asm-m68k/smplock.h new file mode 100644 index 000000000..e62326a10 --- /dev/null +++ b/include/asm-m68k/smplock.h @@ -0,0 +1,49 @@ +/* + * <asm/smplock.h> + * + * Default SMP lock implementation + */ +#include <linux/interrupt.h> +#include <asm/spinlock.h> + +extern spinlock_t kernel_flag; + +/* + * Release global kernel lock and global interrupt lock + */ +#define release_kernel_lock(task, cpu) \ +do { \ + if (task->lock_depth >= 0) \ + spin_unlock(&kernel_flag); \ + release_irqlock(cpu); \ + __sti(); \ +} while (0) + +/* + * Re-acquire the kernel lock + */ +#define reacquire_kernel_lock(task) \ +do { \ + if (task->lock_depth >= 0) \ + spin_lock(&kernel_flag); \ +} while (0) + + +/* + * Getting the big kernel lock. + * + * This cannot happen asynchronously, + * so we only need to worry about other + * CPU's. + */ +extern __inline__ void lock_kernel(void) +{ + if (!++current->lock_depth) + spin_lock(&kernel_flag); +} + +extern __inline__ void unlock_kernel(void) +{ + if (--current->lock_depth < 0) + spin_unlock(&kernel_flag); +} diff --git a/include/asm-m68k/softirq.h b/include/asm-m68k/softirq.h index bed386d44..0798b0d7d 100644 --- a/include/asm-m68k/softirq.h +++ b/include/asm-m68k/softirq.h @@ -61,5 +61,6 @@ extern inline void end_bh_atomic(void) /* These are for the irq's testing the lock */ #define softirq_trylock(cpu) (local_bh_count[cpu] ? 0 : (local_bh_count[cpu]=1)) #define softirq_endlock(cpu) (local_bh_count[cpu] = 0) +#define synchronize_bh() do { } while (0) #endif diff --git a/include/asm-m68k/stat.h b/include/asm-m68k/stat.h index 919520ff1..2e35a9e82 100644 --- a/include/asm-m68k/stat.h +++ b/include/asm-m68k/stat.h @@ -38,4 +38,42 @@ struct stat { unsigned long __unused5; }; +#if 0 +typedef struct { + unsigned int major; + unsigned int minor; +} __new_dev_t; + +struct stat64 { + __new_dev_t st_dev; + __u64 st_ino; + unsigned int st_mode; + unsigned int st_nlink; + unsigned int st_uid; + unsigned int st_gid; + __new_dev_t st_rdev; + __s64 st_size; + __u64 st_blocks; + unsigned long st_atime; + unsigned long __unused1; + unsigned long st_mtime; + unsigned long __unused2; + unsigned long st_ctime; + unsigned long __unused3; + unsigned long st_blksize; + unsigned long __unused4; +}; +#endif + +#define __XSTAT_VER_1 1 +#define __XSTAT_VER_2 2 +#define __XSTAT_VER_MASK 0xff + +#define __XSTAT_VER_XSTAT 0x000 +#define __XSTAT_VER_LXSTAT 0x100 +#define __XSTAT_VER_FXSTAT 0x200 +#define __XSTAT_VER_TYPEMASK 0xff00 + +#define __XMKNOD_VER_1 1 + #endif /* _M68K_STAT_H */ diff --git a/include/asm-m68k/system.h b/include/asm-m68k/system.h index 729f7b34b..cee722633 100644 --- a/include/asm-m68k/system.h +++ b/include/asm-m68k/system.h @@ -60,7 +60,7 @@ asmlinkage void resume(void); struct __xchg_dummy { unsigned long a[100]; }; #define __xg(x) ((volatile struct __xchg_dummy *)(x)) -#if defined(CONFIG_ATARI) && !defined(CONFIG_AMIGA) && !defined(CONFIG_MAC) && !defined(CONFIG_HADES) +#if defined(CONFIG_ATARI) && !defined(CONFIG_AMIGA) && !defined(CONFIG_MAC) && !defined(CONFIG_HADES) && !defined(CONFIG_VME) && !defined(CONFIG_APOLLO) /* block out HSYNC on the atari */ #define __sti() __asm__ __volatile__ ("andiw #0xfbff,%/sr": : : "memory") #else /* portable version */ diff --git a/include/asm-m68k/termios.h b/include/asm-m68k/termios.h index 43d6707e7..24408872e 100644 --- a/include/asm-m68k/termios.h +++ b/include/asm-m68k/termios.h @@ -55,6 +55,7 @@ struct termio { #define N_AX25 5 #define N_X25 6 /* X.25 async */ #define N_6PACK 7 +#define N_MASC 8 /* Reserved fo Mobitex module <kaz@cafe.net> */ #ifdef __KERNEL__ diff --git a/include/asm-m68k/timex.h b/include/asm-m68k/timex.h new file mode 100644 index 000000000..fe5cff581 --- /dev/null +++ b/include/asm-m68k/timex.h @@ -0,0 +1,15 @@ +/* + * linux/include/asm-m68k/timex.h + * + * m68k architecture timex specifications + */ +#ifndef _ASMm68k_TIMEX_H +#define _ASMm68k_TIMEX_H + +#define CLOCK_TICK_RATE 1193180 /* Underlying HZ */ +#define CLOCK_TICK_FACTOR 20 /* Factor of both 1000000 and CLOCK_TICK_RATE */ +#define FINETUNE ((((((long)LATCH * HZ - CLOCK_TICK_RATE) << SHIFT_HZ) * \ + (1000000/CLOCK_TICK_FACTOR) / (CLOCK_TICK_RATE/CLOCK_TICK_FACTOR)) \ + << (SHIFT_SCALE-SHIFT_HZ)) / HZ) + +#endif diff --git a/include/asm-m68k/uaccess.h b/include/asm-m68k/uaccess.h index 864c49657..64b8be7bd 100644 --- a/include/asm-m68k/uaccess.h +++ b/include/asm-m68k/uaccess.h @@ -200,6 +200,7 @@ __generic_copy_to_user(void *to, const void *from, unsigned long n) "5:\n" ".section .fixup,\"ax\"\n" " .even\n" + "60:addql #1,%2\n" "6: lsll #2,%2\n" " addl %4,%2\n" " jra 5b\n" @@ -210,9 +211,11 @@ __generic_copy_to_user(void *to, const void *from, unsigned long n) ".previous\n" ".section __ex_table,\"a\"\n" " .align 4\n" + " .long 1b,60b\n" " .long 22b,6b\n" " .long 2b,6b\n" " .long 24b,7b\n" + " .long 3b,60b\n" " .long 4b,7b\n" " .long 25b,8b\n" " .long 5b,8b\n" @@ -458,16 +461,20 @@ __constant_copy_from_user(void *to, const void *from, unsigned long n) "31: movesl %%d0,(%0)+\n" \ "11: subql #1,%2\n" \ " jne 10b\n" \ + "41:\n" \ ".section .fixup,\"ax\"\n" \ " .even\n" \ + "22: addql #1,%2\n" \ "12: lsll #2,%2\n" \ fixup "\n" \ " jra 13f\n" \ ".previous\n" \ ".section __ex_table,\"a\"\n" \ " .align 4\n" \ + " .long 10b,22b\n" \ " .long 31b,12b\n" \ " .long 11b,12b\n" \ + " .long 41b,22b\n" \ ".previous\n" \ copy "\n" \ "13:" \ @@ -803,6 +810,7 @@ clear_user(void *to, unsigned long n) "5:\n" ".section .fixup,\"ax\"\n" " .even\n" + "61:addql #1,%1\n" "6: lsll #2,%1\n" " addl %2,%1\n" " jra 5b\n" @@ -813,8 +821,9 @@ clear_user(void *to, unsigned long n) ".previous\n" ".section __ex_table,\"a\"\n" " .align 4\n" - " .long 1b,6b\n" + " .long 1b,61b\n" " .long 2b,6b\n" + " .long 3b,61b\n" " .long 24b,7b\n" " .long 4b,7b\n" " .long 25b,8b\n" diff --git a/include/asm-m68k/unistd.h b/include/asm-m68k/unistd.h index df55187a6..4ed5d9f34 100644 --- a/include/asm-m68k/unistd.h +++ b/include/asm-m68k/unistd.h @@ -27,7 +27,7 @@ #define __NR_lseek 19 #define __NR_getpid 20 #define __NR_mount 21 -#define __NR_umount 22 +#define __NR_oldumount 22 #define __NR_setuid 23 #define __NR_getuid 24 #define __NR_stime 25 @@ -57,7 +57,7 @@ #define __NR_geteuid 49 #define __NR_getegid 50 #define __NR_acct 51 -#define __NR_phys 52 +#define __NR_umount 52 #define __NR_lock 53 #define __NR_ioctl 54 #define __NR_fcntl 55 @@ -187,6 +187,13 @@ #define __NR_pread 180 #define __NR_pwrite 181 #define __NR_lchown 182 +#define __NR_getcwd 183 +#define __NR_capget 184 +#define __NR_capset 185 +#define __NR_sigaltstack 186 +#define __NR_sendfile 187 +#define __NR_streams1 188 /* some people actually want it */ +#define __NR_streams2 189 /* some people actually want it */ /* user-visible error numbers are in the range -1 - -122: see <asm-m68k/errno.h> */ @@ -326,13 +333,16 @@ static inline _syscall1(int,delete_module,const char *,name) */ static inline pid_t kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) { - register long retval __asm__ ("d0") = __NR_clone; - register long clone_arg __asm__ ("d1") = flags | CLONE_VM; + pid_t pid; mm_segment_t fs; fs = get_fs(); set_fs (KERNEL_DS); + { + register long retval __asm__ ("d0"); + register long clone_arg __asm__ ("d1") = flags | CLONE_VM; + __asm__ __volatile__ ("clrl %%d2\n\t" "trap #0\n\t" /* Linux/m68k system call */ @@ -349,9 +359,11 @@ static inline pid_t kernel_thread(int (*fn)(void *), void * arg, unsigned long f : "0" (__NR_clone), "i" (__NR_exit), "r" (arg), "a" (fn), "d" (clone_arg), "r" (current) : "d0", "d2"); + pid = retval; + } set_fs (fs); - return retval; + return pid; } static inline pid_t wait(int * wait_stat) diff --git a/include/asm-arm/xstat.h b/include/asm-m68k/xstat.h index 84a9b07f9..a0374fcfd 100644 --- a/include/asm-arm/xstat.h +++ b/include/asm-m68k/xstat.h @@ -1,4 +1,4 @@ -/* $Id: xstat.h,v 1.1 1998/02/06 12:52:45 jj Exp $ +/* $Id: xstat.h,v 1.1 1998/02/06 12:51:30 jj Exp $ * xstat.h: sys_xstat/xmknod architecture dependent stuff. * * Copyright (C) 1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) diff --git a/include/asm-mips/bitops.h b/include/asm-mips/bitops.h index 89668887e..d1b1d7152 100644 --- a/include/asm-mips/bitops.h +++ b/include/asm-mips/bitops.h @@ -372,6 +372,27 @@ extern __inline__ unsigned long ffz(unsigned long word) return __res; } +#ifdef __KERNEL__ + +/* + * ffs: find first bit set. This is defined the same way as + * the libc and compiler builtin ffs routines, therefore + * differs in spirit from the above ffz (man ffs). + */ + +#define ffs(x) generic_ffs(x) + +/* + * hweightN: returns the hamming weight (i.e. the number + * of bits set) of a N-bit word + */ + +#define hweight32(x) generic_hweight32(x) +#define hweight16(x) generic_hweight16(x) +#define hweight8(x) generic_hweight8(x) + +#endif /* __KERNEL__ */ + #ifdef __MIPSEB__ /* For now I steal the Sparc C versions, no need for speed, just need to * get it working. diff --git a/include/asm-mips/bootinfo.h b/include/asm-mips/bootinfo.h index d20831322..f41ecd19e 100644 --- a/include/asm-mips/bootinfo.h +++ b/include/asm-mips/bootinfo.h @@ -1,4 +1,5 @@ -/* +/* $Id: bootinfo.h,v 1.5 1998/08/19 21:58:10 ralf Exp $ + * * bootinfo.h -- Definition of the Linux/MIPS boot information structure * * Copyright (C) 1995, 1996 by Ralf Baechle, Andreas Busse, @@ -7,8 +8,6 @@ * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of this archive * for more details. - * - * $Id: bootinfo.h,v 1.3 1997/09/19 08:37:44 ralf Exp $ */ #ifndef __ASM_MIPS_BOOTINFO_H #define __ASM_MIPS_BOOTINFO_H @@ -26,10 +25,10 @@ #define MACH_GROUP_SNI_RM 4 /* Siemens Nixdorf RM series */ #define MACH_GROUP_ACN 5 #define MACH_GROUP_SGI 6 /* Silicon Graphics workstations and servers */ -#define MACH_GROUP_RESERVED 7 /* No Such Architecture */ +#define MACH_GROUP_COBALT 7 /* Cobalt servers */ #define GROUP_NAMES { "unknown", "Jazz", "Digital", "ARC", \ - "SNI", "ACN", "SGI", "NSA" } + "SNI", "ACN", "SGI", "Cobalt" } /* * Valid machtype values for group unknown (low order halfword of mips_machtype) @@ -86,6 +85,13 @@ #define GROUP_SGI_NAMES { "Indy" } /* + * Valid machtype for group COBALT + */ +#define MACH_COBALT_27 0 /* Proto "27" hardware */ + +#define GROUP_COBALT_NAMES { "Microserver 27" } + +/* * Valid cputype values */ #define CPU_UNKNOWN 0 @@ -126,7 +132,7 @@ #define CL_SIZE (80) -#ifndef __LANGUAGE_ASSEMBLY__ +#ifndef _LANGUAGE_ASSEMBLY /* * Some machine parameters passed by the bootloaders. @@ -266,20 +272,18 @@ void bi_TagWalk(void); #ifdef CONFIG_SGI - /* screen info will dissapear... soon */ -#define DEFAULT_SCREEN_INFO {0, 0, {0, 0, }, 0, 0, 158, 0, 0, 0, 62, 0, 16} +//#define DEFAULT_SCREEN_INFO {0, 0, 0, 0, 0, 158, 0, 0, 0, 62, 0, 16} +#define DEFAULT_SCREEN_INFO {0, 0, 0, 0, 0, 160, 0, 0, 0, 64, 0, 16} #define DEFAULT_DRIVE_INFO { {0,}} - #else - /* default values for screen_info variable */ -#define DEFAULT_SCREEN_INFO {0, 0, {0, }, 52, 3, 80, 4626, 3, 9, 50} +#define DEFAULT_SCREEN_INFO {0, 0, 0, 52, 3, 80, 4626, 3, 9, 50} +#endif + /* default values for drive info */ #define DEFAULT_DRIVE_INFO { {0,}} -#endif - /* * These are the kernel variables initialized from @@ -296,6 +300,6 @@ extern unsigned long mips_vram_base; extern unsigned long mips_dma_cache_size; extern unsigned long mips_dma_cache_base; -#endif /* __LANGUAGE_ASSEMBLY__ */ +#endif /* _LANGUAGE_ASSEMBLY */ #endif /* __ASM_MIPS_BOOTINFO_H */ diff --git a/include/asm-mips/current.h b/include/asm-mips/current.h index 30facf94b..bcaf22b5c 100644 --- a/include/asm-mips/current.h +++ b/include/asm-mips/current.h @@ -1,13 +1,21 @@ +/* $Id: current.h,v 1.4 1998/07/20 17:52:19 ralf Exp $ + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 1998 Ralf Baechle + */ #ifndef __ASM_MIPS_CURRENT_H #define __ASM_MIPS_CURRENT_H -#ifdef __LANGUAGE_C__ +#ifdef _LANGUAGE_C /* MIPS rules... */ register struct task_struct *current asm("$28"); -#endif /* __LANGUAGE_C__ */ -#ifdef __LANGUAGE_ASSEMBLY__ +#endif /* _LANGUAGE_C */ +#ifdef _LANGUAGE_ASSEMBLY /* * Special variant for use by exception handlers when the stack pointer diff --git a/include/asm-mips/gdb-stub.h b/include/asm-mips/gdb-stub.h index d0e757c9b..0bf2aafb9 100644 --- a/include/asm-mips/gdb-stub.h +++ b/include/asm-mips/gdb-stub.h @@ -1,9 +1,11 @@ -/* - * include/asm-mips/gdb-stub.h +/* $Id: gdb-stub.h,v 1.3 1998/07/20 17:52:19 ralf Exp $ + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. * - * Copyright (C) 1995 Andreas Busse + * Copyright (C) 1995 Andreas Busse */ - #ifndef __ASM_MIPS_GDB_STUB_H #define __ASM_MIPS_GDB_STUB_H @@ -131,7 +133,7 @@ #define GDB_FR_SIZE ((((GDB_FR_CP0_PRID) + 4) + (PTRSIZE-1)) & ~(PTRSIZE-1)) -#ifndef __LANGUAGE_ASSEMBLY__ +#ifndef _LANGUAGE_ASSEMBLY /* * This is the same as above, but for the high-level @@ -207,5 +209,5 @@ struct gdb_regs { void set_debug_traps(void); -#endif /* __LANGUAGE_ASSEMBLY */ +#endif /* _LANGUAGE_ASSEMBLY */ #endif /* __ASM_MIPS_GDB_STUB_H */ diff --git a/include/asm-mips/hardirq.h b/include/asm-mips/hardirq.h index 9a666e6c5..f651556c0 100644 --- a/include/asm-mips/hardirq.h +++ b/include/asm-mips/hardirq.h @@ -1,3 +1,11 @@ +/* $Id: hardirq.h,v 1.4 1998/08/20 11:26:19 ralf Exp $ + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 1997, 1998 by Ralf Baechle + */ #ifndef __ASM_MIPS_HARDIRQ_H #define __ASM_MIPS_HARDIRQ_H @@ -5,6 +13,13 @@ extern unsigned int local_irq_count[NR_CPUS]; +/* + * Are we in an interrupt context? Either doing bottom half + * or hardware interrupt processing? + */ +#define in_interrupt() ({ int __cpu = smp_processor_id(); \ + (local_irq_count[__cpu] + local_bh_count[__cpu] != 0); }) + #ifndef __SMP__ #define hardirq_trylock(cpu) (local_irq_count[cpu] == 0) diff --git a/include/asm-mips/ioctls.h b/include/asm-mips/ioctls.h index c7142ceb2..5e268a1c5 100644 --- a/include/asm-mips/ioctls.h +++ b/include/asm-mips/ioctls.h @@ -1,5 +1,4 @@ -/* - * ioctls for Linux/MIPS. +/* $Id: ioctls.h,v 1.5 1998/08/19 21:58:11 ralf Exp $ * * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive @@ -113,5 +112,7 @@ #define TIOCSERSETMULTI 0x5490 /* Set multiport config */ #define TIOCMIWAIT 0x5491 /* wait for a change on serial input line(s) */ #define TIOCGICOUNT 0x5492 /* read serial port inline interrupt counts */ +#define TIOCGHAYESESP 0x5493 /* Get Hayes ESP configuration */ +#define TIOCSHAYESESP 0x5494 /* Set Hayes ESP configuration */ #endif /* __ASM_MIPS_IOCTLS_H */ diff --git a/include/asm-mips/jazz.h b/include/asm-mips/jazz.h index 7cd009438..f57cf7b95 100644 --- a/include/asm-mips/jazz.h +++ b/include/asm-mips/jazz.h @@ -1,15 +1,10 @@ -/* - * Hardware info about Mips JAZZ and similar systems +/* $Id: jazz.h,v 1.6 1998/08/18 20:46:39 ralf Exp $ * * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive * for more details. * - * Copyright (C) 1995 by Andreas Busse and Ralf Baechle - * - * This file is a mess. It really needs some reorganisation! - * - * $Id: jazz.h,v 1.5 1997/12/01 21:26:48 ralf Exp $ + * Copyright (C) 1995 - 1998 by Andreas Busse and Ralf Baechle */ #ifndef __ASM_MIPS_JAZZ_H #define __ASM_MIPS_JAZZ_H @@ -76,7 +71,7 @@ #define LED_E 0x9e #define LED_F 0x8e -#ifndef __LANGUAGE_ASSEMBLY__ +#ifndef _LANGUAGE_ASSEMBLY extern __inline__ void pica_set_led(unsigned int bits) { @@ -106,7 +101,7 @@ extern __inline__ void pica_set_led(unsigned int bits) #define JAZZ_KEYBOARD_DATA 0xe0005000 #define JAZZ_KEYBOARD_COMMAND 0xe0005001 -#ifndef __LANGUAGE_ASSEMBLY__ +#ifndef _LANGUAGE_ASSEMBLY typedef struct { unsigned char data; @@ -158,7 +153,7 @@ typedef struct { /* * DRAM configuration register */ -#ifndef __LANGUAGE_ASSEMBLY__ +#ifndef _LANGUAGE_ASSEMBLY #ifdef __MIPSEL__ typedef struct { unsigned int bank2 : 3; @@ -178,7 +173,7 @@ typedef struct { unsigned int bank2 : 3; } dram_configuration; #endif -#endif /* __LANGUAGE_ASSEMBLY__ */ +#endif /* _LANGUAGE_ASSEMBLY */ #define PICA_DRAM_CONFIG 0xe00fffe0 @@ -213,7 +208,6 @@ typedef struct { #define JAZZ_SERIAL1_IRQ 18 #define JAZZ_SERIAL2_IRQ 19 #define JAZZ_PARALLEL_IRQ 20 -#define JAZZ_MOUSE_IRQ 21 /* * JAZZ DMA Channels @@ -269,7 +263,7 @@ typedef struct { /* * Access the R4030 DMA and I/O Controller */ -#ifndef __LANGUAGE_ASSEMBLY__ +#ifndef _LANGUAGE_ASSEMBLY extern inline void r4030_delay(void) { @@ -302,7 +296,7 @@ extern inline void r4030_write_reg16(unsigned addr, unsigned val) r4030_delay(); } -extern inline unsigned int r4030_write_reg32(unsigned addr, unsigned val) +extern inline void r4030_write_reg32(unsigned addr, unsigned val) { *((volatile unsigned int *)addr) = val; r4030_delay(); diff --git a/include/asm-mips/keyboard.h b/include/asm-mips/keyboard.h index bba0a1876..6b393c032 100644 --- a/include/asm-mips/keyboard.h +++ b/include/asm-mips/keyboard.h @@ -5,7 +5,7 @@ * License. See the file "COPYING" in the main directory of this archive * for more details. * - * $Id: keyboard.h,v 1.7 1998/05/07 03:02:50 ralf Exp $ + * $Id: keyboard.h,v 1.8 1998/07/13 23:27:07 tsbogend Exp $ */ #ifndef __ASM_MIPS_KEYBOARD_H #define __ASM_MIPS_KEYBOARD_H @@ -52,13 +52,11 @@ void (*keyboard_setup)(void); #ifdef CONFIG_MIPS_JAZZ /* Not true for Jazz machines, we cheat a bit for 'em. */ -#define KEYBOARD_IRQ 1 - -extern int jazz_ps2_request_irq(void); -extern void jazz_ps2_free_irq(void); +#define KEYBOARD_IRQ 1 -#define ps2_request_irq() jazz_ps2_request_irq() -#define ps2_free_irq(inode) jazz_ps2_free_irq() +/* + * No PS/2 style mouse support for Jazz machines + */ #endif /* CONFIG_MIPS_JAZZ */ @@ -78,6 +76,10 @@ extern void jazz_ps2_free_irq(void); #endif /* CONFIG_SGI */ +#ifdef CONFIG_COBALT_MICRO_SERVER +#define KEYBOARD_IRQ 1 +#endif + #if defined(CONFIG_ACER_PICA_61) || defined(CONFIG_SNI_RM200_PCI) #define CONF_KEYBOARD_USES_IO_PORTS #endif diff --git a/include/asm-mips/linux_logo.h b/include/asm-mips/linux_logo.h new file mode 100644 index 000000000..b4ad836a3 --- /dev/null +++ b/include/asm-mips/linux_logo.h @@ -0,0 +1,69 @@ +/* $Id: linux_logo.h,v 1.1 1998/08/19 21:58:12 ralf Exp $ + * include/asm-mips/linux_logo.h: This is a linux logo + * to be displayed on boot. + * + * Copyright (C) 1996 Larry Ewing (lewing@isc.tamu.edu) + * Copyright (C) 1996 Jakub Jelinek (jj@sunsite.mff.cuni.cz) + * + * You can put anything here, but: + * LINUX_LOGO_COLORS has to be less than 224 + * image size has to be 80x80 + * values have to start from 0x20 + * (i.e. RGB(linux_logo_red[0], + * linux_logo_green[0], + * linux_logo_blue[0]) is color 0x20) + * BW image has to be 80x80 as well, with MS bit + * on the left + * Serial_console ascii image can be any size, + * but should contain %s to display the version + */ + +#include <linux/init.h> +#include <linux/version.h> + +#define linux_logo_banner "Linux/m68k version " UTS_RELEASE + +#define LINUX_LOGO_COLORS 221 + +#ifdef INCLUDE_LINUX_LOGO_DATA + +#define INCLUDE_LINUX_LOGO16 +#include <linux/linux_logo.h> + +/* Painted by Johnny Stenback <jst@uwasa.fi> */ + +unsigned char *linux_serial_image __initdata = "\n" +" .u$e.\n" +" .$$$$$:S\n" +" $\"*$/\"*$$\n" +" $.`$ . ^F\n" +" 4k+#+T.$F\n" +" 4P+++\"$\"$\n" +" :R\"+ t$$B\n" +" ___# $$$\n" +" | | R$$k\n" +" dd. | Linux $!$\n" +" ddd | MIPS $9$F\n" +" '!!!!!$ !!#!`\n" +" !!!!!* .!!!!!`\n" +"'!!!!!!!W..e$$!!!!!!` %s\n" +" \"~^^~ ^~~^\n" +"\n"; + +#else + +/* prototypes only */ +extern unsigned char linux_logo_red[]; +extern unsigned char linux_logo_green[]; +extern unsigned char linux_logo_blue[]; +extern unsigned char linux_logo[]; +extern unsigned char linux_logo_bw[]; +extern unsigned char linux_logo16_red[]; +extern unsigned char linux_logo16_green[]; +extern unsigned char linux_logo16_blue[]; +extern unsigned char linux_logo16[]; +extern unsigned char *linux_serial_image; + +extern int (*console_show_logo)(void); + +#endif diff --git a/include/asm-mips/md.h b/include/asm-mips/md.h new file mode 100644 index 000000000..aff87490d --- /dev/null +++ b/include/asm-mips/md.h @@ -0,0 +1,14 @@ +/* $Id: md.h,v 1.1 1998/08/17 10:20:14 ralf Exp $ + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ +#ifndef __ASM_MD_H +#define __ASM_MD_H + +/* #define HAVE_ARCH_XORBLOCK */ + +#define MD_XORBLOCK_ALIGNMENT sizeof(long) + +#endif /* __ASM_MD_H */ diff --git a/include/asm-mips/mipsregs.h b/include/asm-mips/mipsregs.h index 2a563efb9..4b26fa496 100644 --- a/include/asm-mips/mipsregs.h +++ b/include/asm-mips/mipsregs.h @@ -1,5 +1,4 @@ -/* - * include/asm-mips/mipsregs.h +/* $Id: mipsregs.h,v 1.6 1998/08/17 11:27:08 ralf Exp $ * * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive @@ -7,8 +6,6 @@ * * Copyright (C) 1994, 1995, 1996, 1997 by Ralf Baechle * Modified for further R[236]000 support by Paul M. Antoine, 1996. - * - * $Id: mipsregs.h,v 1.4 1997/09/20 19:02:46 root Exp $ */ #ifndef __ASM_MIPS_MIPSREGS_H #define __ASM_MIPS_MIPSREGS_H @@ -157,7 +154,7 @@ #define C_IRQ4 (1<<14) #define C_IRQ5 (1<<15) -#ifndef __LANGUAGE_ASSEMBLY__ +#ifndef _LANGUAGE_ASSEMBLY /* * Manipulate the status register. * Mostly used to access the interrupt bits. @@ -181,7 +178,7 @@ __BUILD_SET_CP0(status,CP0_STATUS) __BUILD_SET_CP0(cause,CP0_CAUSE) __BUILD_SET_CP0(config,CP0_CONFIG) -#endif /* defined (__LANGUAGE_ASSEMBLY__) */ +#endif /* defined (_LANGUAGE_ASSEMBLY) */ /* * Inline code for use of the ll and sc instructions @@ -319,18 +316,18 @@ __BUILD_SET_CP0(config,CP0_CONFIG) /* * Bits in the coprozessor 0 config register. */ -#define CONFIG_CM_CACHABLE_NO_WA 0 -#define CONFIG_CM_CACHABLE_WA 1 -#define CONFIG_CM_UNCACHED 2 -#define CONFIG_CM_CACHABLE_NONCOHERENT 3 -#define CONFIG_CM_CACHABLE_CE 4 -#define CONFIG_CM_CACHABLE_COW 5 -#define CONFIG_CM_CACHABLE_CUW 6 -#define CONFIG_CM_CACHABLE_ACCELERATED 7 -#define CONFIG_CM_CMASK 7 -#define CONFIG_DB (1 << 4) -#define CONFIG_IB (1 << 5) -#define CONFIG_SC (1 << 17) +#define CONF_CM_CACHABLE_NO_WA 0 +#define CONF_CM_CACHABLE_WA 1 +#define CONF_CM_UNCACHED 2 +#define CONF_CM_CACHABLE_NONCOHERENT 3 +#define CONF_CM_CACHABLE_CE 4 +#define CONF_CM_CACHABLE_COW 5 +#define CONF_CM_CACHABLE_CUW 6 +#define CONF_CM_CACHABLE_ACCELERATED 7 +#define CONF_CM_CMASK 7 +#define CONF_DB (1 << 4) +#define CONF_IB (1 << 5) +#define CONF_SC (1 << 17) /* * R10000 performance counter definitions. @@ -388,7 +385,7 @@ __BUILD_SET_CP0(config,CP0_CONFIG) #define CEB_KERNEL 2 /* Count events in kernel mode EXL = ERL = 0 */ #define CEB_EXL 1 /* Count events with EXL = 1, ERL = 0 */ -#ifndef __LANGUAGE_ASSEMBLY__ +#ifndef _LANGUAGE_ASSEMBLY /* * Functions to access the performance counter and control registers */ diff --git a/include/asm-mips/ncr53c94.h b/include/asm-mips/ncr53c94.h deleted file mode 100644 index bf5c072f4..000000000 --- a/include/asm-mips/ncr53c94.h +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Makefile for MIPS Linux main source directory - * - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 1996 by Ralf Baechle - */ - -/* - * As far as I know there are some MIPS boxes which have their NCRs - * mapped with pad bytes. For these NCR_PAD will have to be redefined. - */ -#define NCR_PAD(name) -struct ncr53c94 { - NCR_PAD(pad0); - volatile unsigned char count_lo; - NCR_PAD(pad1); - volatile unsigned char count_hi; - NCR_PAD(pad2); - volatile unsigned char fifo; - NCR_PAD(pad3); - volatile unsigned char command; - NCR_PAD(pad4); - union { - volatile unsigned char status; - volatile unsigned char dest_id; - } s_d; - NCR_PAD(pad5); - union { - volatile unsigned char interrupts; - volatile unsigned char timeout; - } i_t; - NCR_PAD(pad6); - union { - volatile unsigned char seqn_step; - volatile unsigned char sync_period; - } s_p; - NCR_PAD(pad7); - union { - volatile unsigned char fifo_flags; - volatile unsigned char sync_offset; - } f_o; - NCR_PAD(pad8); - volatile unsigned char config1; - NCR_PAD(pad9); - volatile unsigned char clk_conv; - NCR_PAD(pad10); - volatile unsigned char test; - NCR_PAD(pad11); - volatile unsigned char config2; - NCR_PAD(pad12); - volatile unsigned char config3; - NCR_PAD(pad13); - volatile unsigned char unused; - NCR_PAD(pad14); - volatile unsigned char count_xhi; - NCR_PAD(pad15); - volatile unsigned char fifo_b; -}; - -/* - * Clock conversion factors - */ -#define CCV_10MHZ 0x2 /* 10 Mhz */ -#define CCV_15MHZ 0x3 /* 10.01 - 15 Mhz */ -#define CCV_20MHZ 0x4 /* 15.01 - 20 Mhz */ -#define CCV_25MHZ 0x5 /* 20.01 - 25 Mhz */ -#define CCV_30MHZ 0x6 /* 25.01 - 30 Mhz */ -#define CCV_35MHZ 0x7 /* 30.01 - 35 Mhz */ -#define CCV_40MHZ 0x0 /* 35.01 - 40 Mhz */ - -/* - * Set this additional to enable DMA for a command. - */ -#define NCR_DMA 0x80 - -/* - * Miscellaneous commands - */ -#define NCR_NOP 0x00 -#define NCR_FLUSH_FIFO 0x01 -#define NCR_RESET_NCR 0x02 -#define NCR_RESET_SCSI 0x03 - -/* - * Disconnected state commands - */ -#define NCR_SELECT_NO_ATN 0x41 -#define NCR_SELECT_ATN 0x42 -#define NCR_SELECT_ATN_STOP 0x43 -#define NCR_ENABLE_RESEL 0x44 -#define NCR_DISABLE_RESEL 0x45 -#define NCR_SELECT_ATN3 0x46 - -/* - * Initiator state commands - */ -#define NCR_TRANSFER 0x10 -#define NCR_CMD_CMP 0x11 -#define NCR_MSG_OK 0x12 -#define NCR_TRANSFER_PAD 0x18 -#define NCR_SET_ATN 0x1a -#define NCR_RESET_ATN 0x1b - -/* - * Target state commands - */ -#define NCR_SEND_MSG 0x20 -#define NCR_SEND_STATUS 0x21 -#define NCR_SEND_DATA 0x22 -#define NCR_DISC_SEQN 0x23 -#define NCR_TERM_SEQN 0x24 -#define NCR_CMD_COMP_SEQN 0x25 -#define NCR_DISC 0x27 -#define NCR_REC_MSG 0x28 -#define NCR_REC_CMD 0x29 -#define NCR_REC_DATA 0x2a -#define NCR_REC_CMD_SEQN 0x2b -#define NCR_ABORT_DMA 0x04 diff --git a/include/asm-mips/newport.h b/include/asm-mips/newport.h new file mode 100644 index 000000000..a9ef5b3e5 --- /dev/null +++ b/include/asm-mips/newport.h @@ -0,0 +1,586 @@ +/* $Id: newport.h,v 1.1 1998/08/19 21:58:12 ralf Exp $ + * + * newport.h: Defines and register layout for NEWPORT graphics + * hardware. + * + * Copyright (C) 1996 David S. Miller (dm@engr.sgi.com) + */ + +#ifndef _SGI_NEWPORT_H +#define _SGI_NEWPORT_H + + +typedef volatile unsigned long npireg_t; + +union npfloat { + volatile float f; + npireg_t i; +}; + +typedef union npfloat npfreg_t; + +union np_dcb { + npireg_t all; + struct { volatile unsigned short s0, s1; } hwords; + struct { volatile unsigned char b0, b1, b2, b3; } bytes; +}; + +struct newport_rexregs { + npireg_t drawmode1; /* GL extra mode bits */ + +#define DM1_PLANES 0x00000007 +#define DM1_NOPLANES 0x00000000 +#define DM1_RGBPLANES 0x00000001 +#define DM1_RGBAPLANES 0x00000002 +#define DM1_OLAYPLANES 0x00000004 +#define DM1_PUPPLANES 0x00000005 +#define DM1_CIDPLANES 0x00000006 + +#define NPORT_DMODE1_DDMASK 0x00000018 +#define NPORT_DMODE1_DD4 0x00000000 +#define NPORT_DMODE1_DD8 0x00000008 +#define NPORT_DMODE1_DD12 0x00000010 +#define NPORT_DMODE1_DD24 0x00000018 +#define NPORT_DMODE1_DSRC 0x00000020 +#define NPORT_DMODE1_YFLIP 0x00000040 +#define NPORT_DMODE1_RWPCKD 0x00000080 +#define NPORT_DMODE1_HDMASK 0x00000300 +#define NPORT_DMODE1_HD4 0x00000000 +#define NPORT_DMODE1_HD8 0x00000100 +#define NPORT_DMODE1_HD12 0x00000200 +#define NPORT_DMODE1_HD32 0x00000300 +#define NPORT_DMODE1_RWDBL 0x00000400 +#define NPORT_DMODE1_ESWAP 0x00000800 /* Endian swap */ +#define NPORT_DMODE1_CCMASK 0x00007000 +#define NPORT_DMODE1_CCLT 0x00001000 +#define NPORT_DMODE1_CCEQ 0x00002000 +#define NPORT_DMODE1_CCGT 0x00004000 +#define NPORT_DMODE1_RGBMD 0x00008000 +#define NPORT_DMODE1_DENAB 0x00010000 /* Dither enable */ +#define NPORT_DMODE1_FCLR 0x00020000 /* Fast clear */ +#define NPORT_DMODE1_BENAB 0x00040000 /* Blend enable */ +#define NPORT_DMODE1_SFMASK 0x00380000 +#define NPORT_DMODE1_SF0 0x00000000 +#define NPORT_DMODE1_SF1 0x00080000 +#define NPORT_DMODE1_SFDC 0x00100000 +#define NPORT_DMODE1_SFMDC 0x00180000 +#define NPORT_DMODE1_SFSA 0x00200000 +#define NPORT_DMODE1_SFMSA 0x00280000 +#define NPORT_DMODE1_DFMASK 0x01c00000 +#define NPORT_DMODE1_DF0 0x00000000 +#define NPORT_DMODE1_DF1 0x00400000 +#define NPORT_DMODE1_DFSC 0x00800000 +#define NPORT_DMODE1_DFMSC 0x00c00000 +#define NPORT_DMODE1_DFSA 0x01000000 +#define NPORT_DMODE1_DFMSA 0x01400000 +#define NPORT_DMODE1_BBENAB 0x02000000 /* Back blend enable */ +#define NPORT_DMODE1_PFENAB 0x04000000 /* Pre-fetch enable */ +#define NPORT_DMODE1_ABLEND 0x08000000 /* Alpha blend */ +#define NPORT_DMODE1_LOMASK 0xf0000000 +#define NPORT_DMODE1_LOZERO 0x00000000 +#define NPORT_DMODE1_LOAND 0x10000000 +#define NPORT_DMODE1_LOANDR 0x20000000 +#define NPORT_DMODE1_LOSRC 0x30000000 +#define NPORT_DMODE1_LOANDI 0x40000000 +#define NPORT_DMODE1_LODST 0x50000000 +#define NPORT_DMODE1_LOXOR 0x60000000 +#define NPORT_DMODE1_LOOR 0x70000000 +#define NPORT_DMODE1_LONOR 0x80000000 +#define NPORT_DMODE1_LOXNOR 0x90000000 +#define NPORT_DMODE1_LONDST 0xa0000000 +#define NPORT_DMODE1_LOORR 0xb0000000 +#define NPORT_DMODE1_LONSRC 0xc0000000 +#define NPORT_DMODE1_LOORI 0xd0000000 +#define NPORT_DMODE1_LONAND 0xe0000000 +#define NPORT_DMODE1_LOONE 0xf0000000 + + npireg_t drawmode0; /* REX command register */ + + /* These bits define the graphics opcode being performed. */ +#define NPORT_DMODE0_OPMASK 0x00000003 /* Opcode mask */ +#define NPORT_DMODE0_NOP 0x00000000 /* No operation */ +#define NPORT_DMODE0_RD 0x00000001 /* Read operation */ +#define NPORT_DMODE0_DRAW 0x00000002 /* Draw operation */ +#define NPORT_DMODE0_S2S 0x00000003 /* Screen to screen operation */ + + /* The following decide what addressing mode(s) are to be used */ +#define NPORT_DMODE0_AMMASK 0x0000001c /* Address mode mask */ +#define NPORT_DMODE0_SPAN 0x00000000 /* Spanning address mode */ +#define NPORT_DMODE0_BLOCK 0x00000004 /* Block address mode */ +#define NPORT_DMODE0_ILINE 0x00000008 /* Iline address mode */ +#define NPORT_DMODE0_FLINE 0x0000000c /* Fline address mode */ +#define NPORT_DMODE0_ALINE 0x00000010 /* Aline address mode */ +#define NPORT_DMODE0_TLINE 0x00000014 /* Tline address mode */ +#define NPORT_DMODE0_BLINE 0x00000018 /* Bline address mode */ + + /* And now some misc. operation control bits. */ +#define NPORT_DMODE0_DOSETUP 0x00000020 +#define NPORT_DMODE0_CHOST 0x00000040 +#define NPORT_DMODE0_AHOST 0x00000080 +#define NPORT_DMODE0_STOPX 0x00000100 +#define NPORT_DMODE0_STOPY 0x00000200 +#define NPORT_DMODE0_SK1ST 0x00000400 +#define NPORT_DMODE0_SKLST 0x00000800 +#define NPORT_DMODE0_ZPENAB 0x00001000 +#define NPORT_DMODE0_LISPENAB 0x00002000 +#define NPORT_DMODE0_LISLST 0x00004000 +#define NPORT_DMODE0_L32 0x00008000 +#define NPORT_DMODE0_ZOPQ 0x00010000 +#define NPORT_DMODE0_LISOPQ 0x00020000 +#define NPORT_DMODE0_SHADE 0x00040000 +#define NPORT_DMODE0_LRONLY 0x00080000 +#define NPORT_DMODE0_XYOFF 0x00100000 +#define NPORT_DMODE0_CLAMP 0x00200000 +#define NPORT_DMODE0_ENDPF 0x00400000 +#define NPORT_DMODE0_YSTR 0x00800000 + + npireg_t lsmode; /* Mode for line stipple ops */ + npireg_t lspattern; /* Pattern for line stipple ops */ + npireg_t lspatsave; /* Backup save pattern */ + npireg_t zpattern; /* Pixel zpattern */ + npireg_t colorback; /* Background color */ + npireg_t colorvram; /* Clear color for fast vram */ + npireg_t alpharef; /* Reference value for afunctions */ + unsigned long pad0; + npireg_t smask0x; /* Window GL relative screen mask 0 */ + npireg_t smask0y; /* Window GL relative screen mask 0 */ + npireg_t _setup; + npireg_t _stepz; + npireg_t _lsrestore; + npireg_t _lssave; + + unsigned long _pad1[0x30]; + + /* Iterators, full state for context switch */ + npfreg_t _xstart; /* X-start point (current) */ + npfreg_t _ystart; /* Y-start point (current) */ + npfreg_t _xend; /* x-end point */ + npfreg_t _yend; /* y-end point */ + npireg_t xsave; /* copy of xstart integer value for BLOCk addressing MODE */ + npireg_t xymove; /* x.y offset from xstart, ystart for relative operations */ + npfreg_t bresd; + npfreg_t bress1;; + npireg_t bresoctinc1; + volatile int bresrndinc2; + npireg_t brese1; + npireg_t bress2; + npireg_t aweight0; + npireg_t aweight1; + npfreg_t xstartf; + npfreg_t ystartf; + npfreg_t xendf; + npfreg_t yendf; + npireg_t xstarti; + npfreg_t xendf1; + npireg_t xystarti; + npireg_t xyendi; + npireg_t xstartendi; + + unsigned long _unused2[0x29]; + + npfreg_t colorred; + npfreg_t coloralpha; + npfreg_t colorgrn; + npfreg_t colorblue; + npfreg_t slopered; + npfreg_t slopealpha; + npfreg_t slopegrn; + npfreg_t slopeblue; + npireg_t wrmask; + npireg_t colori; + npfreg_t colorx; + npfreg_t slopered1; + npireg_t hostrw0; + npireg_t hostrw1; + npireg_t dcbmode; +#define NPORT_DMODE_WMASK 0x00000003 +#define NPORT_DMODE_W4 0x00000000 +#define NPORT_DMODE_W1 0x00000001 +#define NPORT_DMODE_W2 0x00000002 +#define NPORT_DMODE_W3 0x00000003 +#define NPORT_DMODE_EDPACK 0x00000004 +#define NPORT_DMODE_ECINC 0x00000008 +#define NPORT_DMODE_CMASK 0x00000070 +#define NPORT_DMODE_AMASK 0x00000780 +#define NPORT_DMODE_AVC2 0x00000000 +#define NPORT_DMODE_ACMALL 0x00000080 +#define NPORT_DMODE_ACM0 0x00000100 +#define NPORT_DMODE_ACM1 0x00000180 +#define NPORT_DMODE_AXMALL 0x00000200 +#define NPORT_DMODE_AXM0 0x00000280 +#define NPORT_DMODE_AXM1 0x00000300 +#define NPORT_DMODE_ABT 0x00000380 +#define NPORT_DMODE_AVCC1 0x00000400 +#define NPORT_DMODE_AVAB1 0x00000480 +#define NPORT_DMODE_ALG3V0 0x00000500 +#define NPORT_DMODE_A1562 0x00000580 +#define NPORT_DMODE_ESACK 0x00000800 +#define NPORT_DMODE_EASACK 0x00001000 +#define NPORT_DMODE_CWMASK 0x0003e000 +#define NPORT_DMODE_CHMASK 0x007c0000 +#define NPORT_DMODE_CSMASK 0x0f800000 +#define NPORT_DMODE_SENDIAN 0x10000000 + + unsigned long _unused3; + + union np_dcb dcbdata0; + npireg_t dcbdata1; +}; + +struct newport_cregs { + npireg_t smask1x; + npireg_t smask1y; + npireg_t smask2x; + npireg_t smask2y; + npireg_t smask3x; + npireg_t smask3y; + npireg_t smask4x; + npireg_t smask4y; + npireg_t topscan; + npireg_t xywin; + npireg_t clipmode; +#define NPORT_CMODE_SM0 0x00000001 +#define NPORT_CMODE_SM1 0x00000002 +#define NPORT_CMODE_SM2 0x00000004 +#define NPORT_CMODE_SM3 0x00000008 +#define NPORT_CMODE_SM4 0x00000010 +#define NPORT_CMODE_CMSK 0x00001e00 + + unsigned long _unused0; + unsigned long config; +#define NPORT_CFG_G32MD 0x00000001 +#define NPORT_CFG_BWIDTH 0x00000002 +#define NPORT_CFG_ERCVR 0x00000004 +#define NPORT_CFG_BDMSK 0x00000078 +#define NPORT_CFG_GDMSK 0x00000f80 +#define NPORT_CFG_GD0 0x00000080 +#define NPORT_CFG_GD1 0x00000100 +#define NPORT_CFG_GD2 0x00000200 +#define NPORT_CFG_GD3 0x00000400 +#define NPORT_CFG_GD4 0x00000800 +#define NPORT_CFG_GFAINT 0x00001000 +#define NPORT_CFG_TOMSK 0x0000e000 +#define NPORT_CFG_VRMSK 0x00070000 +#define NPORT_CFG_FBTYP 0x00080000 + + npireg_t _unused1; + npireg_t stat; +#define NPORT_STAT_VERS 0x00000007 +#define NPORT_STAT_GBUSY 0x00000008 +#define NPORT_STAT_BBUSY 0x00000010 +#define NPORT_STAT_VRINT 0x00000020 +#define NPORT_STAT_VIDINT 0x00000040 +#define NPORT_STAT_GLMSK 0x00001f80 +#define NPORT_STAT_BLMSK 0x0007e000 +#define NPORT_STAT_BFIRQ 0x00080000 +#define NPORT_STAT_GFIRQ 0x00100000 + + npireg_t ustat; + npireg_t dreset; +}; + +struct newport_regs { + struct newport_rexregs set; + unsigned long _unused0[0x16e]; + struct newport_rexregs go; + unsigned long _unused1[0x22e]; + struct newport_cregs cset; + unsigned long _unused2[0x1ef]; + struct newport_cregs cgo; +}; +extern struct newport_regs *npregs; + + +typedef struct { + unsigned int drawmode1; + unsigned int drawmode0; + unsigned int lsmode; + unsigned int lspattern; + unsigned int lspatsave; + unsigned int zpattern; + unsigned int colorback; + unsigned int colorvram; + unsigned int alpharef; + unsigned int smask0x; + unsigned int smask0y; + unsigned int _xstart; + unsigned int _ystart; + unsigned int _xend; + unsigned int _yend; + unsigned int xsave; + unsigned int xymove; + unsigned int bresd; + unsigned int bress1; + unsigned int bresoctinc1; + unsigned int bresrndinc2; + unsigned int brese1; + unsigned int bress2; + + unsigned int aweight0; + unsigned int aweight1; + unsigned int colorred; + unsigned int coloralpha; + unsigned int colorgrn; + unsigned int colorblue; + unsigned int slopered; + unsigned int slopealpha; + unsigned int slopegrn; + unsigned int slopeblue; + unsigned int wrmask; + unsigned int hostrw0; + unsigned int hostrw1; + + /* configregs */ + + unsigned int smask1x; + unsigned int smask1y; + unsigned int smask2x; + unsigned int smask2y; + unsigned int smask3x; + unsigned int smask3y; + unsigned int smask4x; + unsigned int smask4y; + unsigned int topscan; + unsigned int xywin; + unsigned int clipmode; + unsigned int config; + + /* dcb registers */ + unsigned int dcbmode; + unsigned int dcbdata0; + unsigned int dcbdata1; +} newport_ctx; + +/* Reading/writing VC2 registers. */ +#define VC2_REGADDR_INDEX 0x00000000 +#define VC2_REGADDR_IREG 0x00000010 +#define VC2_REGADDR_RAM 0x00000030 +#define VC2_PROTOCOL (NPORT_DMODE_EASACK | 0x00800000 | 0x00040000) + +#define VC2_VLINET_ADDR 0x000 +#define VC2_VFRAMET_ADDR 0x400 +#define VC2_CGLYPH_ADDR 0x500 + +/* Now the Indexed registers of the VC2. */ +#define VC2_IREG_VENTRY 0x00 +#define VC2_IREG_CENTRY 0x01 +#define VC2_IREG_CURSX 0x02 +#define VC2_IREG_CURSY 0x03 +#define VC2_IREG_CCURSX 0x04 +#define VC2_IREG_DENTRY 0x05 +#define VC2_IREG_SLEN 0x06 +#define VC2_IREG_RADDR 0x07 +#define VC2_IREG_VFPTR 0x08 +#define VC2_IREG_VLSPTR 0x09 +#define VC2_IREG_VLIR 0x0a +#define VC2_IREG_VLCTR 0x0b +#define VC2_IREG_CTPTR 0x0c +#define VC2_IREG_WCURSY 0x0d +#define VC2_IREG_DFPTR 0x0e +#define VC2_IREG_DLTPTR 0x0f +#define VC2_IREG_CONTROL 0x10 +#define VC2_IREG_CONFIG 0x20 + +extern inline void newport_vc2_set(struct newport_regs *regs, unsigned char vc2ireg, + unsigned short val) +{ + regs->set.dcbmode = (NPORT_DMODE_AVC2 | VC2_REGADDR_INDEX | NPORT_DMODE_W3 | + NPORT_DMODE_ECINC | VC2_PROTOCOL); + regs->set.dcbdata0.all = (vc2ireg << 24) | (val << 8); +} + +extern inline unsigned short newport_vc2_get(struct newport_regs *regs, + unsigned char vc2ireg) +{ + regs->set.dcbmode = (NPORT_DMODE_AVC2 | VC2_REGADDR_INDEX | NPORT_DMODE_W1 | + NPORT_DMODE_ECINC | VC2_PROTOCOL); + regs->set.dcbdata0.bytes.b3 = vc2ireg; + regs->set.dcbmode = (NPORT_DMODE_AVC2 | VC2_REGADDR_IREG | NPORT_DMODE_W2 | + NPORT_DMODE_ECINC | VC2_PROTOCOL); + return regs->set.dcbdata0.hwords.s1; +} + +/* VC2 Control register bits */ +#define VC2_CTRL_EVIRQ 0x0001 +#define VC2_CTRL_EDISP 0x0002 +#define VC2_CTRL_EVIDEO 0x0004 +#define VC2_CTRL_EDIDS 0x0008 +#define VC2_CTRL_ECURS 0x0010 +#define VC2_CTRL_EGSYNC 0x0020 +#define VC2_CTRL_EILACE 0x0040 +#define VC2_CTRL_ECDISP 0x0080 +#define VC2_CTRL_ECCURS 0x0100 +#define VC2_CTRL_ECG64 0x0200 +#define VC2_CTRL_GLSEL 0x0400 + +/* Controlling the color map on NEWPORT. */ +#define NCMAP_REGADDR_AREG 0x00000000 +#define NCMAP_REGADDR_ALO 0x00000000 +#define NCMAP_REGADDR_AHI 0x00000010 +#define NCMAP_REGADDR_PBUF 0x00000020 +#define NCMAP_REGADDR_CREG 0x00000030 +#define NCMAP_REGADDR_SREG 0x00000040 +#define NCMAP_REGADDR_RREG 0x00000060 +#define NCMAP_PROTOCOL (0x00008000 | 0x00040000 | 0x00800000) + +static inline void newport_cmap_setaddr(struct newport_regs *regs, + unsigned short addr) +{ + regs->set.dcbmode = (NPORT_DMODE_ACMALL | NCMAP_PROTOCOL | + NPORT_DMODE_SENDIAN | NPORT_DMODE_ECINC | + NCMAP_REGADDR_AREG | NPORT_DMODE_W2); + regs->set.dcbdata0.hwords.s1 = addr; + regs->set.dcbmode = (NPORT_DMODE_ACMALL | NCMAP_PROTOCOL | + NCMAP_REGADDR_PBUF | NPORT_DMODE_W3); +} + +static inline void newport_cmap_setrgb(struct newport_regs *regs, + unsigned char red, + unsigned char green, + unsigned char blue) +{ + regs->set.dcbdata0.all = + (red << 24) | + (green << 16) | + (blue << 8); +} + +/* Miscellaneous NEWPORT routines. */ +#define BUSY_TIMEOUT 100000 +static inline int newport_wait(void) +{ + int i = 0; + + while(i < BUSY_TIMEOUT) + if(!(npregs->cset.stat & NPORT_STAT_GBUSY)) + break; + if(i == BUSY_TIMEOUT) + return 1; + return 0; +} + +static inline int newport_bfwait(void) +{ + int i = 0; + + while(i < BUSY_TIMEOUT) + if(!(npregs->cset.stat & NPORT_STAT_BBUSY)) + break; + if(i == BUSY_TIMEOUT) + return 1; + return 0; +} + +/* newport.c and cons_newport.c routines */ +extern struct graphics_ops *newport_probe (int, const char **); + +void newport_save (void *); +void newport_restore (void *); +void newport_reset (void); +int newport_ioctl (int card, int cmd, unsigned long arg); + +/* + * DCBMODE register defines: + */ + +/* Widht of the data being transfered for each DCBDATA[01] word */ +#define DCB_DATAWIDTH_4 0x0 +#define DCB_DATAWIDTH_1 0x1 +#define DCB_DATAWIDTH_2 0x2 +#define DCB_DATAWIDTH_3 0x3 + +/* If set, all of DCBDATA will be moved, otherwise only DATAWIDTH bytes */ +#define DCB_ENDATAPACK (1 << 2) + +/* Enables DCBCRS auto increment after each DCB transfer */ +#define DCB_ENCRSINC (1 << 3) + +/* shift for accessing the control register select address (DBCCRS, 3 bits) */ +#define DCB_CRS_SHIFT 4 + +/* DCBADDR (4 bits): display bus slave address */ +#define DCB_ADDR_SHIFT 7 +#define DCB_VC2 (0 << DCB_ADDR_SHIFT) +#define DCB_CMAP_ALL (1 << DCB_ADDR_SHIFT) +#define DCB_CMAP0 (2 << DCB_ADDR_SHIFT) +#define DCB_CMAP1 (3 << DCB_ADDR_SHIFT) +#define DCB_XMAP_ALL (4 << DCB_ADDR_SHIFT) +#define DCB_XMAP0 (5 << DCB_ADDR_SHIFT) +#define DCB_XMAP1 (6 << DCB_ADDR_SHIFT) +#define DCB_BT445 (7 << DCB_ADDR_SHIFT) +#define DCB_VCC1 (8 << DCB_ADDR_SHIFT) +#define DCB_VAB1 (9 << DCB_ADDR_SHIFT) +#define DCB_LG3_BDVERS0 (10 << DCB_ADDR_SHIFT) +#define DCB_LG3_ICS1562 (11 << DCB_ADDR_SHIFT) +#define DCB_RESERVED (15 << DCB_ADDR_SHIFT) + +/* DCB protocol ack types */ +#define DCB_ENSYNCACK (1 << 11) +#define DCB_ENASYNCACK (1 << 12) + +#define DCB_CSWIDTH_SHIFT 13 +#define DCB_CSHOLD_SHIFT 18 +#define DCB_CSSETUP_SHIFT 23 + +/* XMAP9 specific defines */ +/* XMAP9 -- registers as seen on the DCBMODE register*/ +# define XM9_CRS_CONFIG (0 << DCB_CRS_SHIFT) +# define XM9_PUPMODE (1 << 0) +# define XM9_ODD_PIXEL (1 << 1) +# define XM9_8_BITPLANES (1 << 2) +# define XM9_SLOW_DCB (1 << 3) +# define XM9_VIDEO_RGBMAP_MASK (3 << 4) +# define XM9_EXPRESS_VIDEO (1 << 6) +# define XM9_VIDEO_OPTION (1 << 7) +# define XM9_CRS_REVISION (1 << DCB_CRS_SHIFT) +# define XM9_CRS_FIFO_AVAIL (2 << DCB_CRS_SHIFT) +# define XM9_FIFO_0_AVAIL 0 +# define XM9_FIFO_1_AVAIL 1 +# define XM9_FIFO_2_AVAIL 3 +# define XM9_FIFO_3_AVAIL 2 +# define XM9_FIFO_FULL XM9_FIFO_0_AVAIL +# define XM9_FIFO_EMPTY XM9_FIFO_3_AVAIL +# define XM9_CRS_CURS_CMAP_MSB (3 << DCB_CRS_SHIFT) +# define XM9_CRS_PUP_CMAP_MSB (4 << DCB_CRS_SHIFT) +# define XM9_CRS_MODE_REG_DATA (5 << DCB_CRS_SHIFT) +# define XM9_CRS_MODE_REG_INDEX (7 << DCB_CRS_SHIFT) + + +#define DCB_CYCLES(setup,hold,width) \ + ((hold << DCB_CSHOLD_SHIFT) | \ + (setup << DCB_CSSETUP_SHIFT)| \ + (width << DCB_CSWIDTH_SHIFT)) + +#define W_DCB_XMAP9_PROTOCOL DCB_CYCLES (2, 1, 0) +#define WSLOW_DCB_XMAP9_PROTOCOL DCB_CYCLES (5, 5, 0) +#define WAYSLOW_DCB_XMAP9_PROTOCOL DCB_CYCLES (12, 12, 0) +#define R_DCB_XMAP9_PROTOCOL DCB_CYCLES (2, 1, 3) + +static inline void +xmap9FIFOWait (struct newport_regs *rex) +{ + rex->set.dcbmode = DCB_XMAP0 | XM9_CRS_FIFO_AVAIL | + DCB_DATAWIDTH_1 | R_DCB_XMAP9_PROTOCOL; + newport_bfwait (); + + while ((rex->set.dcbdata0.bytes.b3 & 3) != XM9_FIFO_EMPTY) + ; +} + +static inline void +xmap9SetModeReg (struct newport_regs *rex, unsigned int modereg, unsigned int data24, int cfreq) +{ + if (cfreq > 119) + rex->set.dcbmode = DCB_XMAP_ALL | XM9_CRS_MODE_REG_DATA | + DCB_DATAWIDTH_4 | W_DCB_XMAP9_PROTOCOL; + else if (cfreq > 59) + rex->set.dcbmode = DCB_XMAP_ALL | XM9_CRS_MODE_REG_DATA | + DCB_DATAWIDTH_4 | WSLOW_DCB_XMAP9_PROTOCOL; + else + rex->set.dcbmode = DCB_XMAP_ALL | XM9_CRS_MODE_REG_DATA | + DCB_DATAWIDTH_4 | WAYSLOW_DCB_XMAP9_PROTOCOL; + rex->set.dcbdata0.all = ((modereg) << 24) | (data24 & 0xffffff); +} + +#endif /* !(_SGI_NEWPORT_H) */ + diff --git a/include/asm-mips/offset.h b/include/asm-mips/offset.h index 5f89c2852..6f7a5b019 100644 --- a/include/asm-mips/offset.h +++ b/include/asm-mips/offset.h @@ -46,35 +46,36 @@ /* MIPS task_struct offsets. */ #define TASK_STATE 0 -#define TASK_COUNTER 52 -#define TASK_PRIORITY 56 #define TASK_FLAGS 4 #define TASK_SIGPENDING 8 -#define TASK_MM 936 +#define TASK_NEED_RESCHED 20 +#define TASK_COUNTER 24 +#define TASK_PRIORITY 28 +#define TASK_MM 928 /* MIPS specific thread_struct offsets. */ -#define THREAD_REG16 576 -#define THREAD_REG17 580 -#define THREAD_REG18 584 -#define THREAD_REG19 588 -#define THREAD_REG20 592 -#define THREAD_REG21 596 -#define THREAD_REG22 600 -#define THREAD_REG23 604 -#define THREAD_REG29 608 -#define THREAD_REG30 612 -#define THREAD_REG31 616 -#define THREAD_STATUS 620 -#define THREAD_FPU 624 -#define THREAD_BVADDR 888 -#define THREAD_BUADDR 892 -#define THREAD_ECODE 896 -#define THREAD_TRAPNO 900 -#define THREAD_PGDIR 904 -#define THREAD_MFLAGS 908 -#define THREAD_CURDS 912 -#define THREAD_TRAMP 916 -#define THREAD_OLDCTX 920 +#define THREAD_REG16 568 +#define THREAD_REG17 572 +#define THREAD_REG18 576 +#define THREAD_REG19 580 +#define THREAD_REG20 584 +#define THREAD_REG21 588 +#define THREAD_REG22 592 +#define THREAD_REG23 596 +#define THREAD_REG29 600 +#define THREAD_REG30 604 +#define THREAD_REG31 608 +#define THREAD_STATUS 612 +#define THREAD_FPU 616 +#define THREAD_BVADDR 880 +#define THREAD_BUADDR 884 +#define THREAD_ECODE 888 +#define THREAD_TRAPNO 892 +#define THREAD_PGDIR 896 +#define THREAD_MFLAGS 900 +#define THREAD_CURDS 904 +#define THREAD_TRAMP 908 +#define THREAD_OLDCTX 912 /* Linux mm_struct offsets. */ #define MM_COUNT 12 diff --git a/include/asm-mips/page.h b/include/asm-mips/page.h index 1bde35833..36c0a73e2 100644 --- a/include/asm-mips/page.h +++ b/include/asm-mips/page.h @@ -1,4 +1,4 @@ -/* $Id: page.h,v 1.2 1998/06/30 00:23:11 ralf Exp $ +/* $Id: page.h,v 1.3 1998/07/13 23:29:09 tsbogend Exp $ * * Definitions for page handling * @@ -20,7 +20,7 @@ #define STRICT_MM_TYPECHECKS -#ifndef __LANGUAGE_ASSEMBLY__ +#ifndef _LANGUAGE_ASSEMBLY #ifdef __SMP__ #define ULOCK_DECLARE extern spinlock_t user_page_lock; @@ -117,7 +117,7 @@ typedef unsigned long pgprot_t; #endif /* !defined (STRICT_MM_TYPECHECKS) */ -#endif /* __LANGUAGE_ASSEMBLY__ */ +#endif /* _LANGUAGE_ASSEMBLY */ /* to align the pointer to the (next) page boundary */ #define PAGE_ALIGN(addr) (((addr)+PAGE_SIZE-1)&PAGE_MASK) @@ -129,7 +129,8 @@ typedef unsigned long pgprot_t; #define PAGE_OFFSET 0x80000000UL #define __pa(x) ((unsigned long) (x) - PAGE_OFFSET) #define __va(x) ((void *)((unsigned long) (x) + PAGE_OFFSET)) -#define MAP_NR(addr) (__pa(addr) >> PAGE_SHIFT) +#define MAP_MASK 0x1fffffffUL +#define MAP_NR(addr) ((((unsigned long)(addr)) & MAP_MASK) >> PAGE_SHIFT) #endif /* defined (__KERNEL__) */ diff --git a/include/asm-mips/pci.h b/include/asm-mips/pci.h index d2ff867f2..40781ed92 100644 --- a/include/asm-mips/pci.h +++ b/include/asm-mips/pci.h @@ -1,12 +1,10 @@ -/* $Id: pci.h,v 1.2 1997/12/01 18:00:40 ralf Exp $ +/* $Id: pci.h,v 1.3 1998/05/07 14:18:11 ralf Exp $ * * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive * for more details. * * Declarations for the MIPS specific implementation of the PCI BIOS32 services. - * - * Copyright (C) 1997, 1998 Ralf Baechle */ #ifndef __ASM_MIPS_PCI_H #define __ASM_MIPS_PCI_H diff --git a/include/asm-mips/pgtable.h b/include/asm-mips/pgtable.h index e84692a40..dccd199ad 100644 --- a/include/asm-mips/pgtable.h +++ b/include/asm-mips/pgtable.h @@ -1,4 +1,4 @@ -/* $Id: pgtable.h,v 1.11 1998/07/14 09:31:48 ralf Exp $ +/* $Id: pgtable.h,v 1.14 1998/07/16 19:10:04 ralf Exp $ * * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive @@ -12,7 +12,7 @@ #include <asm/addrspace.h> #include <asm/mipsconfig.h> -#ifndef __LANGUAGE_ASSEMBLY__ +#ifndef _LANGUAGE_ASSEMBLY #include <linux/linkage.h> #include <asm/cachectl.h> @@ -61,7 +61,7 @@ extern void (*add_wired_entry)(unsigned long entrylo0, unsigned long entrylo1, * works even with the cache aliasing problem the R4k and above have. */ -#endif /* !defined (__LANGUAGE_ASSEMBLY__) */ +#endif /* !defined (_LANGUAGE_ASSEMBLY) */ /* PMD_SHIFT determines the size of the area a second-level page table can map */ #define PMD_SHIFT 22 @@ -79,9 +79,11 @@ extern void (*add_wired_entry)(unsigned long entrylo0, unsigned long entrylo1, #define PTRS_PER_PTE 1024 #define PTRS_PER_PMD 1 #define PTRS_PER_PGD 1024 +#define USER_PTRS_PER_PGD (TASK_SIZE/PGDIR_SIZE) #define VMALLOC_START KSEG2 #define VMALLOC_VMADDR(x) ((unsigned long)(x)) +#define VMALLOC_END KSEG3 /* Note that we shift the lower 32bits of each EntryLo[01] entry * 6 bits to the left. That way we can convert the PFN into the @@ -166,7 +168,7 @@ extern void (*add_wired_entry)(unsigned long entrylo0, unsigned long entrylo1, #define __S110 PAGE_SHARED #define __S111 PAGE_SHARED -#if !defined (__LANGUAGE_ASSEMBLY__) +#if !defined (_LANGUAGE_ASSEMBLY) /* * BAD_PAGETABLE is used when we need a bogus page-table, while @@ -354,7 +356,7 @@ extern inline pte_t mk_pte(unsigned long page, pgprot_t pgprot) extern inline pte_t mk_pte_phys(unsigned long physpage, pgprot_t pgprot) { - return __pte(physpage | pgprot_val(pgprot)); + return __pte((physpage - PAGE_OFFSET) | pgprot_val(pgprot)); } extern inline pte_t pte_modify(pte_t pte, pgprot_t newprot) @@ -385,77 +387,141 @@ extern inline pte_t *pte_offset(pmd_t * dir, unsigned long address) } /* + * Initialize new page directory with pointers to invalid ptes + */ +extern void (*pgd_init)(unsigned long page); + +/* * Allocate and free page tables. The xxx_kernel() versions are * used to allocate a kernel page table - this turns on ASN bits * if any. */ -extern inline void pte_free_kernel(pte_t *pte) + +#define pgd_quicklist (current_cpu_data.pgd_quick) +#define pmd_quicklist ((unsigned long *)0) +#define pte_quicklist (current_cpu_data.pte_quick) +#define pgtable_cache_size (current_cpu_data.pgtable_cache_sz) + +extern __inline__ pgd_t *get_pgd_slow(void) { - free_page((unsigned long) pte); + pgd_t *ret = (pgd_t *)__get_free_page(GFP_KERNEL), *init; + + if (ret) { + init = pgd_offset(&init_mm, 0); + pgd_init((unsigned long)ret); + memcpy (ret + USER_PTRS_PER_PGD, init + USER_PTRS_PER_PGD, + (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t)); + } + return ret; } -extern const char bad_pmd_string[]; +extern __inline__ pgd_t *get_pgd_fast(void) +{ + unsigned long *ret; + + if((ret = pgd_quicklist) != NULL) { + pgd_quicklist = (unsigned long *)(*ret); + ret[0] = ret[1]; + pgtable_cache_size--; + } else + ret = (unsigned long *)get_pgd_slow(); + return (pgd_t *)ret; +} -extern inline pte_t *pte_alloc_kernel(pmd_t *pmd, unsigned long address) +extern __inline__ void free_pgd_fast(pgd_t *pgd) { - address = (address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1); - if (pmd_none(*pmd)) { - pte_t *page = (pte_t *) get_free_page(GFP_KERNEL); - if (pmd_none(*pmd)) { - if (page) { - pmd_set(pmd, page); - return page + address; - } - pmd_set(pmd, (pte_t *) BAD_PAGETABLE); - return NULL; - } - free_page((unsigned long) page); - } - if (pmd_bad(*pmd)) { - printk(bad_pmd_string, pmd_val(*pmd)); - pmd_set(pmd, (pte_t *) BAD_PAGETABLE); - return NULL; + *(unsigned long *)pgd = (unsigned long) pgd_quicklist; + pgd_quicklist = (unsigned long *) pgd; + pgtable_cache_size++; +} + +extern __inline__ void free_pgd_slow(pgd_t *pgd) +{ + free_page((unsigned long)pgd); +} + +extern pte_t *get_pte_slow(pmd_t *pmd, unsigned long address_preadjusted); +extern pte_t *get_pte_kernel_slow(pmd_t *pmd, unsigned long address_preadjusted); + +extern __inline__ pte_t *get_pte_fast(void) +{ + unsigned long *ret; + + if((ret = (unsigned long *)pte_quicklist) != NULL) { + pte_quicklist = (unsigned long *)(*ret); + ret[0] = ret[1]; + pgtable_cache_size--; } - return (pte_t *) pmd_page(*pmd) + address; + return (pte_t *)ret; } -/* - * allocating and freeing a pmd is trivial: the 1-entry pmd is - * inside the pgd, so has no extra memory associated with it. - */ -extern inline void pmd_free_kernel(pmd_t *pmd) +extern __inline__ void free_pte_fast(pte_t *pte) { - pmd_val(*pmd) = ((unsigned long) invalid_pte_table); + *(unsigned long *)pte = (unsigned long) pte_quicklist; + pte_quicklist = (unsigned long *) pte; + pgtable_cache_size++; } -extern inline pmd_t *pmd_alloc_kernel(pgd_t *pgd, unsigned long address) +extern __inline__ void free_pte_slow(pte_t *pte) { - return (pmd_t *) pgd; + free_page((unsigned long)pte); } -extern inline void pte_free(pte_t *pte) +/* We don't use pmd cache, so these are dummy routines */ +extern __inline__ pmd_t *get_pmd_fast(void) { - free_page((unsigned long) pte); + return (pmd_t *)0; } -extern inline pte_t *pte_alloc(pmd_t *pmd, unsigned long address) +extern __inline__ void free_pmd_fast(pmd_t *pmd) +{ +} + +extern __inline__ void free_pmd_slow(pmd_t *pmd) +{ +} + +extern void __bad_pte(pmd_t *pmd); +extern void __bad_pte_kernel(pmd_t *pmd); + +#define pte_free_kernel(pte) free_pte_fast(pte) +#define pte_free(pte) free_pte_fast(pte) +#define pgd_free(pgd) free_pgd_fast(pgd) +#define pgd_alloc() get_pgd_fast() + +extern inline pte_t * pte_alloc_kernel(pmd_t * pmd, unsigned long address) +{ + address = (address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1); + + if (pmd_none(*pmd)) { + pte_t *page = get_pte_fast(); + if (page) { + pmd_val(*pmd) = (unsigned long)page; + return page + address; + } + return get_pte_kernel_slow(pmd, address); + } + if (pmd_bad(*pmd)) { + __bad_pte_kernel(pmd); + return NULL; + } + return (pte_t *) pmd_page(*pmd) + address; +} + +extern inline pte_t * pte_alloc(pmd_t * pmd, unsigned long address) { address = (address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1); + if (pmd_none(*pmd)) { - pte_t *page = (pte_t *) get_free_page(GFP_KERNEL); - if (pmd_none(*pmd)) { - if (page) { - pmd_set(pmd, page); - return page + address; - } - pmd_set(pmd, (pte_t *) BAD_PAGETABLE); - return NULL; + pte_t *page = get_pte_fast(); + if (page) { + pmd_val(*pmd) = (unsigned long)page; + return page + address; } - free_page((unsigned long) page); + return get_pte_slow(pmd, address); } if (pmd_bad(*pmd)) { - printk(bad_pmd_string, pmd_val(*pmd)); - pmd_set(pmd, (pte_t *) BAD_PAGETABLE); + __bad_pte(pmd); return NULL; } return (pte_t *) pmd_page(*pmd) + address; @@ -465,36 +531,45 @@ extern inline pte_t *pte_alloc(pmd_t *pmd, unsigned long address) * allocating and freeing a pmd is trivial: the 1-entry pmd is * inside the pgd, so has no extra memory associated with it. */ -extern inline void pmd_free(pmd_t *pmd) +extern inline void pmd_free(pmd_t * pmd) { - pmd_val(*pmd) = ((unsigned long) invalid_pte_table); } -extern inline pmd_t *pmd_alloc(pgd_t *pgd, unsigned long address) +extern inline pmd_t * pmd_alloc(pgd_t * pgd, unsigned long address) { return (pmd_t *) pgd; } -extern inline void pgd_free(pgd_t *pgd) -{ - free_page((unsigned long) pgd); -} +#define pmd_free_kernel pmd_free +#define pmd_alloc_kernel pmd_alloc -/* - * Initialize new page directory with pointers to invalid ptes - */ -extern void (*pgd_init)(unsigned long page); +extern int do_check_pgt_cache(int, int); -extern inline pgd_t *pgd_alloc(void) +extern inline void set_pgdir(unsigned long address, pgd_t entry) { - unsigned long page; - - if(!(page = __get_free_page(GFP_KERNEL))) - return NULL; - - pgd_init(page); - - return (pgd_t *) page; + struct task_struct * p; + pgd_t *pgd; +#ifdef __SMP__ + int i; +#endif + + read_lock(&tasklist_lock); + for_each_task(p) { + if (!p->mm) + continue; + *pgd_offset(p->mm,address) = entry; + } + read_unlock(&tasklist_lock); +#ifndef __SMP__ + for (pgd = (pgd_t *)pgd_quicklist; pgd; pgd = (pgd_t *)*(unsigned long *)pgd) + pgd[address >> PGDIR_SHIFT] = entry; +#else + /* To pgd_alloc/pgd_free, one holds master kernel lock and so does our + callee, so we can modify pgd caches of other CPUs as well. -jj */ + for (i = 0; i < NR_CPUS; i++) + for (pgd = (pgd_t *)cpu_data[i].pgd_quick; pgd; pgd = (pgd_t *)*(unsigned long *)pgd) + pgd[address >> PGDIR_SHIFT] = entry; +#endif } extern pgd_t swapper_pg_dir[1024]; @@ -512,6 +587,9 @@ extern void (*update_mmu_cache)(struct vm_area_struct *vma, #define module_map vmalloc #define module_unmap vfree +/* Needs to be defined here and not in linux/mm.h, as it is arch dependent */ +#define PageSkip(page) (0) + /* TLB operations. */ extern inline void tlb_probe(void) { @@ -781,6 +859,6 @@ extern inline void set_context(unsigned long val) : : "r" (val)); } -#endif /* !defined (__LANGUAGE_ASSEMBLY__) */ +#endif /* !defined (_LANGUAGE_ASSEMBLY) */ #endif /* __ASM_MIPS_PGTABLE_H */ diff --git a/include/asm-mips/pica.h b/include/asm-mips/pica.h deleted file mode 100644 index a1056f845..000000000 --- a/include/asm-mips/pica.h +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Hardware info about Acer PICA 61 and similar - * - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 1995 by Andreas Busse and Ralf Baechle - */ -#ifndef __ASM_MIPS_PICA_H -#define __ASM_MIPS_PICA_H - -/* - * The addresses below are virtual address. The mappings are - * created on startup via wired entries in the tlb. The Mips - * Magnum R3000 and R4000 machines are similar in many aspects, - * but many hardware register are accessible at 0xb9000000 in - * instead of 0xe0000000. - */ - -/* - * Revision numbers in PICA_ASIC_REVISION - * - * 0xf0000000 - Rev1 - * 0xf0000001 - Rev2 - * 0xf0000002 - Rev3 - */ -#define PICA_ASIC_REVISION 0xe0000008 - -/* - * The segments of the seven segment LED are mapped - * to the control bits as follows: - * - * (7) - * --------- - * | | - * (2) | | (6) - * | (1) | - * --------- - * | | - * (3) | | (5) - * | (4) | - * --------- . (0) - */ -#define PICA_LED 0xe000f000 - -/* - * Some characters for the LED control registers - * The original Mips machines seem to have a LED display - * with integrated decoder while the Acer machines can - * control each of the seven segments and the dot independently. - * It only a toy, anyway... - */ -#define LED_DOT 0x01 -#define LED_SPACE 0x00 -#define LED_0 0xfc -#define LED_1 0x60 -#define LED_2 0xda -#define LED_3 0xf2 -#define LED_4 0x66 -#define LED_5 0xb6 -#define LED_6 0xbe -#define LED_7 0xe0 -#define LED_8 0xfe -#define LED_9 0xf6 -#define LED_A 0xee -#define LED_b 0x3e -#define LED_C 0x9c -#define LED_d 0x7a -#define LED_E 0x9e -#define LED_F 0x8e - -#ifndef __LANGUAGE_ASSEMBLY__ - -extern __inline__ void pica_set_led(unsigned int bits) -{ - volatile unsigned int *led_register = (unsigned int *) PICA_LED; - - *led_register = bits; -} - -#endif - -/* - * i8042 keyboard controller for PICA chipset. - * This address is just a guess and seems to differ - * from the other mips machines... - */ -#define PICA_KEYBOARD_ADDRESS 0xe0005000 -#define PICA_KEYBOARD_DATA 0xe0005000 -#define PICA_KEYBOARD_COMMAND 0xe0005001 - -#ifndef __LANGUAGE_ASSEMBLY__ - -typedef struct { - unsigned char data; - unsigned char command; -} pica_keyboard_hardware; - -typedef struct { - unsigned char pad0[3]; - unsigned char data; - unsigned char pad1[3]; - unsigned char command; -} mips_keyboard_hardware; - -/* - * For now - */ -#define keyboard_hardware pica_keyboard_hardware - -#endif - -/* - * i8042 keyboard controller for most other Mips machines. - */ -#define MIPS_KEYBOARD_ADDRESS 0xb9005000 -#define MIPS_KEYBOARD_DATA 0xb9005003 -#define MIPS_KEYBOARD_COMMAND 0xb9005007 - -#ifndef __LANGUAGE_ASSEMBLY__ - -#endif - -/* - * PICA timer registers and interrupt no. - * Note that the hardware timer interrupt is actually on - * cpu level 6, but to keep compatibility with PC stuff - * it is remapped to vector 0. See arch/mips/kernel/entry.S. - */ -#define PICA_TIMER_INTERVAL 0xe0000228 -#define PICA_TIMER_REGISTER 0xe0000230 - -/* - * DRAM configuration register - */ -#ifndef __LANGUAGE_ASSEMBLY__ -#ifdef __MIPSEL__ -typedef struct { - unsigned int bank2 : 3; - unsigned int bank1 : 3; - unsigned int mem_bus_width : 1; - unsigned int reserved2 : 1; - unsigned int page_mode : 1; - unsigned int reserved1 : 23; -} dram_configuration; -#else /* defined (__MIPSEB__) */ -typedef struct { - unsigned int reserved1 : 23; - unsigned int page_mode : 1; - unsigned int reserved2 : 1; - unsigned int mem_bus_width : 1; - unsigned int bank1 : 3; - unsigned int bank2 : 3; -} dram_configuration; -#endif -#endif /* __LANGUAGE_ASSEMBLY__ */ - -#define PICA_DRAM_CONFIG 0xe00fffe0 - -/* - * PICA interrupt control registers - */ -#define PICA_IO_IRQ_SOURCE 0xe0100000 -#define PICA_IO_IRQ_ENABLE 0xe0100002 - -/* - * Pica interrupt enable bits - */ -#define PIE_PARALLEL (1<<0) -#define PIE_FLOPPY (1<<1) -#define PIE_SOUND (1<<2) -#define PIE_VIDEO (1<<3) -#define PIE_ETHERNET (1<<4) -#define PIE_SCSI (1<<5) -#define PIE_KEYBOARD (1<<6) -#define PIE_MOUSE (1<<7) -#define PIE_SERIAL1 (1<<8) -#define PIE_SERIAL2 (1<<9) - -#endif /* __ASM_MIPS_PICA_H */ diff --git a/include/asm-mips/posix_types.h b/include/asm-mips/posix_types.h index 6ae7982d1..057a44df8 100644 --- a/include/asm-mips/posix_types.h +++ b/include/asm-mips/posix_types.h @@ -1,11 +1,10 @@ -/* - * POSIX types +/* $Id: posix_types.h,v 1.5 1998/08/17 13:59:34 ralf Exp $ * * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive * for more details. * - * Copyright (C) 1996 by Ralf Baechle + * Copyright (C) 1996, 1997, 1998 by Ralf Baechle */ #ifndef __ARCH_MIPS_POSIX_TYPES_H #define __ARCH_MIPS_POSIX_TYPES_H @@ -46,6 +45,8 @@ typedef struct { long val[2]; } __kernel_fsid_t; +#if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) + #undef __FD_SET static __inline__ void __FD_SET(unsigned long __fd, __kernel_fd_set *__fdsetp) { @@ -114,4 +115,6 @@ static __inline__ void __FD_ZERO(__kernel_fd_set *__p) } } +#endif /* defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) */ + #endif /* __ARCH_MIPS_POSIX_TYPES_H */ diff --git a/include/asm-mips/processor.h b/include/asm-mips/processor.h index 63d721720..614c7aa64 100644 --- a/include/asm-mips/processor.h +++ b/include/asm-mips/processor.h @@ -1,28 +1,46 @@ -/* - * include/asm-mips/processor.h +/* $Id: processor.h,v 1.17 1998/08/18 20:46:41 ralf Exp $ * - * Copyright (C) 1994 Waldorf Electronics - * written by Ralf Baechle - * Modified further for R[236]000 compatibility by Paul M. Antoine + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. * - * $Id: processor.h,v 1.10 1998/05/04 09:13:01 ralf Exp $ + * Copyright (C) 1994 Waldorf GMBH + * Copyright (C) 1995, 1996, 1997, 1998 Ralf Baechle + * Modified further for R[236]000 compatibility by Paul M. Antoine */ #ifndef __ASM_MIPS_PROCESSOR_H #define __ASM_MIPS_PROCESSOR_H -#if !defined (__LANGUAGE_ASSEMBLY__) +#if !defined (_LANGUAGE_ASSEMBLY) #include <asm/cachectl.h> #include <asm/mipsregs.h> #include <asm/reg.h> #include <asm/system.h> +struct mips_cpuinfo { + unsigned long *pgd_quick; + unsigned long *pte_quick; + unsigned long pgtable_cache_sz; +}; + /* * System setup and hardware flags.. + * XXX: Should go into mips_cpuinfo. */ extern char wait_available; /* only available on R4[26]00 */ extern char cyclecounter_available; /* only available from R4000 upwards. */ extern char dedicated_iv_available; /* some embedded MIPS like Nevada */ +extern struct mips_cpuinfo boot_cpu_data; + +#ifdef __SMP__ +extern struct mips_cpuinfo cpu_data[]; +#define current_cpu_data cpu_data[smp_processor_id()] +#else +#define cpu_data &boot_cpu_data +#define current_cpu_data boot_cpu_data +#endif + /* * Bus types (default is ISA, but people can check others with these..) * MCA_bus hardcoded to 0 for now. @@ -40,6 +58,9 @@ extern int EISA_bus; #define wp_works_ok 1 #define wp_works_ok__is_a_macro /* for versions in ksyms.c */ +/* Lazy FPU handling on uni-processor */ +extern struct task_struct *last_task_used_math; + /* * User space process size: 2GB. This is hardcoded into a few places, * so don't change it unless you know what you are doing. TASK_SIZE @@ -114,7 +135,7 @@ struct thread_struct { unsigned long irix_oldctx; }; -#endif /* !defined (__LANGUAGE_ASSEMBLY__) */ +#endif /* !defined (_LANGUAGE_ASSEMBLY) */ #define INIT_MMAP { &init_mm, KSEG0, KSEG1, PAGE_SHARED, \ VM_READ | VM_WRITE | VM_EXEC, NULL, &init_mm.mmap } @@ -147,7 +168,7 @@ struct thread_struct { #define KERNEL_STACK_SIZE 8192 -#if !defined (__LANGUAGE_ASSEMBLY__) +#if !defined (_LANGUAGE_ASSEMBLY) /* Free all resources held by a thread. */ extern void release_thread(struct task_struct *); @@ -188,7 +209,7 @@ extern void start_thread(struct pt_regs * regs, unsigned long pc, unsigned long #define init_task (init_task_union.task) #define init_stack (init_task_union.stack) -#endif /* !defined (__LANGUAGE_ASSEMBLY__) */ +#endif /* !defined (_LANGUAGE_ASSEMBLY) */ #endif /* __KERNEL__ */ /* diff --git a/include/asm-mips/serial.h b/include/asm-mips/serial.h index faf916974..7d4f6ecfe 100644 --- a/include/asm-mips/serial.h +++ b/include/asm-mips/serial.h @@ -15,14 +15,9 @@ */ #define BASE_BAUD ( 1843200 / 16 ) -#ifndef CONFIG_OLIVETTI_M700 /* Some Jazz machines seem to have an 8MHz crystal clock but I don't know exactly which ones ... XXX */ #define JAZZ_BASE_BAUD ( 8000000 / 16 ) /* ( 3072000 / 16) */ -#else -/* but the M700 isn't such a strange beast */ -#define JAZZ_BASE_BAUD BASE_BAUD -#endif /* Standard COM flags (except for COM4, because of the 8514 problem) */ #ifdef CONFIG_SERIAL_DETECT_IRQ diff --git a/include/asm-mips/sgidefs.h b/include/asm-mips/sgidefs.h index 72d25346a..06c94226f 100644 --- a/include/asm-mips/sgidefs.h +++ b/include/asm-mips/sgidefs.h @@ -45,7 +45,7 @@ #endif /* - * Now lets try our best to supply some reasonable default values for + * Now let's try our best to supply some reasonable default values for * whatever defines GCC didn't supply. This cannot be done correct for * all possible combinations of options, so be careful with your options * to GCC. Best bet is to keep your fingers off the a.out GCC and use diff --git a/include/asm-mips/siginfo.h b/include/asm-mips/siginfo.h index d4e6f4145..2cf7fd22e 100644 --- a/include/asm-mips/siginfo.h +++ b/include/asm-mips/siginfo.h @@ -43,6 +43,7 @@ typedef struct siginfo { /* SIGCHLD */ struct { pid_t _pid; /* which child */ + uid_t _uid; /* sender's uid */ int _status; /* exit code */ clock_t _utime; clock_t _stime; diff --git a/include/asm-mips/signal.h b/include/asm-mips/signal.h index 0f5988610..e195bc6b2 100644 --- a/include/asm-mips/signal.h +++ b/include/asm-mips/signal.h @@ -1,13 +1,10 @@ -/* - * Linux/MIPS specific definitions for signals. +/* $Id: signal.h,v 1.4 1998/08/18 20:46:42 ralf Exp $ * * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive * for more details. * - * Copyright (C) 1995, 1996, 1997 by Ralf Baechle - * - * $Id: signal.h,v 1.3 1997/12/14 18:57:19 ralf Exp $ + * Copyright (C) 1995, 1996, 1997, 1998 by Ralf Baechle */ #ifndef __ASM_MIPS_SIGNAL_H #define __ASM_MIPS_SIGNAL_H @@ -66,7 +63,7 @@ typedef unsigned long old_sigset_t; /* at least 32 bits */ /* * SA_FLAGS values: * - * SA_ONSTACK is not currently supported, but will allow sigaltstack(2). + * SA_ONSTACK indicates that a registered stack_t will be used. * SA_INTERRUPT is a no-op, but left due to historical reasons. Use the * SA_RESTART flag to get restarting signals (which were the default long ago) * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. @@ -85,8 +82,17 @@ typedef unsigned long old_sigset_t; /* at least 32 bits */ #define SA_NOCLDWAIT 0x00010000 /* Not supported yet */ #define SA_NOCLDSTOP 0x00020000 -#define SA_NOMASK SA_NODEFER /* DANGER: was 0x02000000 */ -#define SA_ONESHOT SA_RESETHAND /* DANGER: was 0x04000000 */ +#define SA_NOMASK SA_NODEFER +#define SA_ONESHOT SA_RESETHAND + +/* + * sigaltstack controls + */ +#define SS_ONSTACK 1 +#define SS_DISABLE 2 + +#define MINSIGSTKSZ 2048 +#define SIGSTKSZ 8192 #ifdef __KERNEL__ /* @@ -130,6 +136,13 @@ struct k_sigaction { void (*ka_restorer)(void); }; +/* IRIX compatible stack_t */ +typedef struct sigaltstack { + void *ss_sp; + size_t ss_size; + int ss_flags; +} stack_t; + #ifdef __KERNEL__ #include <asm/sigcontext.h> #endif diff --git a/include/asm-mips/smp_lock.h b/include/asm-mips/smp_lock.h deleted file mode 100644 index c9482ab7d..000000000 --- a/include/asm-mips/smp_lock.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 1996 Ralf Baechle - * - * Linux/MIPS SMP support. Just a dummy to make building possible. - */ -#ifndef __ASM_MIPS_SMPLOCK_H -#define __ASM_MIPS_SMPLOCK_H - -#ifndef __SMP__ - -#define lock_kernel() do { } while(0) -#define unlock_kernel() do { } while(0) -#define release_kernel_lock(task, cpu, depth) ((depth) = 1) -#define reacquire_kernel_lock(task, cpu, depth) do { } while(0) - -#else - -#error "We do not support SMP on MIPS yet" - -#endif /* __SMP__ */ - -#endif /* __ASM_MIPS_SMPLOCK_H */ diff --git a/include/asm-mips/smplock.h b/include/asm-mips/smplock.h new file mode 100644 index 000000000..61bf3ff9c --- /dev/null +++ b/include/asm-mips/smplock.h @@ -0,0 +1,52 @@ +/* $Id$ + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + * + * Default SMP lock implementation + */ +#include <linux/interrupt.h> +#include <asm/spinlock.h> + +extern spinlock_t kernel_flag; + +/* + * Release global kernel lock and global interrupt lock + */ +#define release_kernel_lock(task, cpu) \ +do { \ + if (task->lock_depth >= 0) \ + spin_unlock(&kernel_flag); \ + release_irqlock(cpu); \ + __sti(); \ +} while (0) + +/* + * Re-acquire the kernel lock + */ +#define reacquire_kernel_lock(task) \ +do { \ + if (task->lock_depth >= 0) \ + spin_lock(&kernel_flag); \ +} while (0) + + +/* + * Getting the big kernel lock. + * + * This cannot happen asynchronously, + * so we only need to worry about other + * CPU's. + */ +extern __inline__ void lock_kernel(void) +{ + if (!++current->lock_depth) + spin_lock(&kernel_flag); +} + +extern __inline__ void unlock_kernel(void) +{ + if (--current->lock_depth < 0) + spin_unlock(&kernel_flag); +} diff --git a/include/asm-mips/string.h b/include/asm-mips/string.h index 7f4bded24..989ebd73e 100644 --- a/include/asm-mips/string.h +++ b/include/asm-mips/string.h @@ -1,13 +1,10 @@ -/* - * include/asm-mips/string.h +/* $Id: string.h,v 1.6 1998/07/20 17:52:21 ralf Exp $ * * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive * for more details. * - * Copyright (c) 1994, 1995, 1996, 1997 by Ralf Baechle - * - * $Id: string.h,v 1.7 1998/03/25 00:24:10 ralf Exp $ + * Copyright (c) 1994, 1995, 1996, 1997, 1998 by Ralf Baechle */ #ifndef __ASM_MIPS_STRING_H #define __ASM_MIPS_STRING_H @@ -127,11 +124,8 @@ extern void *memcpy(void *__to, __const__ void *__from, size_t __n); #define __HAVE_ARCH_MEMMOVE extern void *memmove(void *__dest, __const__ void *__src, size_t __n); +/* Don't build bcopy at all ... */ #define __HAVE_ARCH_BCOPY -extern __inline__ char * bcopy(const char * src, char * dest, int count) -{ - memmove(dest, src, count); -} #define __HAVE_ARCH_MEMSCAN extern __inline__ void *memscan(void *__addr, int __c, size_t __size) diff --git a/include/asm-mips/system.h b/include/asm-mips/system.h index dd5aa3422..c16163a32 100644 --- a/include/asm-mips/system.h +++ b/include/asm-mips/system.h @@ -1,10 +1,10 @@ -/* $Id: system.h,v 1.7 1998/05/04 03:53:22 ralf Exp $ +/* $Id: system.h,v 1.8 1998/07/20 17:52:21 ralf Exp $ * * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive * for more details. * - * Copyright (C) 1994, 1995 by Ralf Baechle + * Copyright (C) 1994, 1995, 1996, 1997, 1998 by Ralf Baechle * Modified further for R[236]000 by Paul M. Antoine, 1996 */ #ifndef __ASM_MIPS_SYSTEM_H @@ -118,13 +118,13 @@ __asm__ __volatile__( \ : /* no input */ \ : "memory") -#if !defined (__LANGUAGE_ASSEMBLY__) +#if !defined (_LANGUAGE_ASSEMBLY) /* * switch_to(n) should switch tasks to task nr n, first * checking that n isn't the current task, in which case it does nothing. */ extern asmlinkage void (*resume)(void *tsk); -#endif /* !defined (__LANGUAGE_ASSEMBLY__) */ +#endif /* !defined (_LANGUAGE_ASSEMBLY) */ #define switch_to(prev,next) \ do { \ diff --git a/include/asm-mips/termios.h b/include/asm-mips/termios.h index 8293b5df1..ae1e770aa 100644 --- a/include/asm-mips/termios.h +++ b/include/asm-mips/termios.h @@ -93,6 +93,7 @@ struct termio { #define N_AX25 5 #define N_X25 6 /* X.25 async */ #define N_6PACK 7 +#define N_MASC 8 /* Reserved fo Mobitex module <kaz@cafe.net> */ #ifdef __KERNEL__ diff --git a/include/asm-mips/timex.h b/include/asm-mips/timex.h new file mode 100644 index 000000000..dd4aea511 --- /dev/null +++ b/include/asm-mips/timex.h @@ -0,0 +1,20 @@ +/* $Id: timex.h,v 1.1 1998/08/17 10:20:18 ralf Exp $ + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 1998 by Ralf Baechle + * + * FIXME: For some of the supported machines this is dead wrong. + */ +#ifndef __ASM_MIPS_TIMEX_H +#define __ASM_MIPS_TIMEX_H + +#define CLOCK_TICK_RATE 1193180 /* Underlying HZ */ +#define CLOCK_TICK_FACTOR 20 /* Factor of both 1000000 and CLOCK_TICK_RATE */ +#define FINETUNE ((((((long)LATCH * HZ - CLOCK_TICK_RATE) << SHIFT_HZ) * \ + (1000000/CLOCK_TICK_FACTOR) / (CLOCK_TICK_RATE/CLOCK_TICK_FACTOR)) \ + << (SHIFT_SCALE-SHIFT_HZ)) / HZ) + +#endif /* __ASM_MIPS_TIMEX_H */ diff --git a/include/asm-mips/unistd.h b/include/asm-mips/unistd.h index a9640faa5..28079fe00 100644 --- a/include/asm-mips/unistd.h +++ b/include/asm-mips/unistd.h @@ -1,6 +1,4 @@ -/* $Id: unistd.h,v 1.13 1998/05/07 15:21:41 ralf Exp $ - * - * This file contains the system call numbers. +/* $Id: unistd.h,v 1.18 1998/08/20 16:34:48 ralf Exp $ * * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive @@ -1010,7 +1008,7 @@ #define __NR_lseek (__NR_Linux + 19) #define __NR_getpid (__NR_Linux + 20) #define __NR_mount (__NR_Linux + 21) -#define __NR_umount (__NR_Linux + 22) +#define __NR_oldumount (__NR_Linux + 22) #define __NR_setuid (__NR_Linux + 23) #define __NR_getuid (__NR_Linux + 24) #define __NR_stime (__NR_Linux + 25) @@ -1040,7 +1038,7 @@ #define __NR_geteuid (__NR_Linux + 49) #define __NR_getegid (__NR_Linux + 50) #define __NR_acct (__NR_Linux + 51) -#define __NR_phys (__NR_Linux + 52) +#define __NR_umount (__NR_Linux + 52) #define __NR_lock (__NR_Linux + 53) #define __NR_ioctl (__NR_Linux + 54) #define __NR_fcntl (__NR_Linux + 55) @@ -1194,13 +1192,17 @@ #define __NR_getcwd (__NR_Linux + 203) #define __NR_capget (__NR_Linux + 204) #define __NR_capset (__NR_Linux + 205) +#define __NR_sigaltstack (__NR_Linux + 206) +#define __NR_sendfile (__NR_Linux + 207) +#define __NR_streams1 (__NR_Linux + 208) +#define __NR_streams2 (__NR_Linux + 209) /* * Offset of the last Linux flavoured syscall */ -#define __NR_Linux_syscalls 205 +#define __NR_Linux_syscalls 209 -#ifndef __LANGUAGE_ASSEMBLY__ +#ifndef _LANGUAGE_ASSEMBLY /* XXX - _foo needs to be __foo, while __NR_bar could be _NR_bar. */ #define _syscall0(type,name) \ @@ -1479,6 +1481,6 @@ static inline pid_t kernel_thread(int (*fn)(void *), void * arg, unsigned long f } #endif /* !defined (__KERNEL_SYSCALLS__) */ -#endif /* !defined (__LANGUAGE_ASSEMBLY__) */ +#endif /* !defined (_LANGUAGE_ASSEMBLY) */ #endif /* __ASM_MIPS_UNISTD_H */ diff --git a/include/asm-mips/vga.h b/include/asm-mips/vga.h new file mode 100644 index 000000000..5fc680563 --- /dev/null +++ b/include/asm-mips/vga.h @@ -0,0 +1,35 @@ +/* + * Access to VGA videoram + * + * (c) 1998 Martin Mares <mj@ucw.cz> + */ + +#ifndef _LINUX_ASM_VGA_H_ +#define _LINUX_ASM_VGA_H_ + +#include <asm/io.h> + +#define VT_BUF_HAVE_RW + +extern inline void scr_writew(u16 val, u16 *addr) +{ + if ((long) addr < 0) + *addr = val; + else + writew(val, (unsigned long) addr); +} + +extern inline u16 scr_readw(u16 *addr) +{ + if ((long) addr < 0) + return *addr; + else + return readw((unsigned long) addr); +} + +#define vga_readb readb +#define vga_writeb writeb + +#define VGA_MAP_MEM(x) (x) + +#endif diff --git a/include/asm-mips/watch.h b/include/asm-mips/watch.h index 6fcde8428..abfc622ef 100644 --- a/include/asm-mips/watch.h +++ b/include/asm-mips/watch.h @@ -1,13 +1,10 @@ -/* - * Functions to use the watch register debugging functionality. +/* $Id: watch.h,v 1.3 1998/08/19 21:58:15 ralf Exp $ * * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive * for more details. * - * Copyright (C) 1996, 1997 by Ralf Baechle - * - * $Id: watch.h,v 1.2 1997/09/19 08:37:44 ralf Exp $ + * Copyright (C) 1996, 1997, 1998 by Ralf Baechle */ #ifndef __ASM_WATCH_H #define __ASM_WATCH_H @@ -24,9 +21,9 @@ enum wref_type { extern char watch_available; -extern asmlinkage __watch_set(unsigned long addr, enum wref_type ref); -extern asmlinkage __watch_clear(void); -extern asmlinkage __watch_reenable(void); +extern asmlinkage void __watch_set(unsigned long addr, enum wref_type ref); +extern asmlinkage void __watch_clear(void); +extern asmlinkage void __watch_reenable(void); #define watch_set(addr, ref) \ if (watch_available) \ diff --git a/include/asm-ppc/amigahw.h b/include/asm-ppc/amigahw.h new file mode 100644 index 000000000..7fae6f85c --- /dev/null +++ b/include/asm-ppc/amigahw.h @@ -0,0 +1 @@ +#include <asm-m68k/amigahw.h> diff --git a/include/asm-ppc/amigaints.h b/include/asm-ppc/amigaints.h new file mode 100644 index 000000000..2de0f46e7 --- /dev/null +++ b/include/asm-ppc/amigaints.h @@ -0,0 +1 @@ +#include <asm-m68k/amigaints.h> diff --git a/include/asm-ppc/amigappc.h b/include/asm-ppc/amigappc.h new file mode 100644 index 000000000..e3abe6809 --- /dev/null +++ b/include/asm-ppc/amigappc.h @@ -0,0 +1,69 @@ +/* +** asm-m68k/amigappc.h -- This header defines some values and pointers for +** the Phase 5 PowerUp card. +** +** Copyright 1997, 1998 by Phase5, Germany. +** +** This file is subject to the terms and conditions of the GNU General Public +** License. See the file COPYING in the main directory of this archive +** for more details. +** +** Created: 7/22/97 by Jesper Skov +*/ + +#ifndef _M68K_AMIGAPPC_H +#define _M68K_AMIGAPPC_H + +/* Maybe add a [#ifdef WANT_ZTWOBASE] condition to amigahw.h? */ +#define zTwoBase (0x80000000) + +/* At CYBERBASEp we'll find the following sum: + * -KERNELBASE+CyberStormMemoryBase + */ +#define CYBERBASEp (0xfff00000) + +#define APUS_WRITE(a,v) (*((volatile unsigned char *)a) = v) +#define APUS_READ(a) (*((volatile unsigned char *)a)) + +#define APUS_IPL_BASE (zTwoBase + 0x00f60000) +#define APUS_REG_RESET (APUS_IPL_BASE + 0x00) +#define APUS_REG_WAITSTATE (APUS_IPL_BASE + 0x10) +#define APUS_REG_SHADOW (APUS_IPL_BASE + 0x18) +#define APUS_REG_LOCK (APUS_IPL_BASE + 0x20) +#define APUS_REG_INT (APUS_IPL_BASE + 0x28) +#define APUS_IPL_EMU (APUS_IPL_BASE + 0x30) + +#define REGSHADOW_SETRESET (0x80) +#define REGSHADOW_SELFRESET (0x40) + +#define REGLOCK_SETRESET (0x80) +#define REGLOCK_BLACKMAGICK1 (0x40) +#define REGLOCK_BLACKMAGICK2 (0x20) +#define REGLOCK_BLACKMAGICK3 (0x10) + +#define REGWAITSTATE_SETRESET (0x80) +#define REGWAITSTATE_PPCW (0x08) +#define REGWAITSTATE_PPCR (0x04) + +#define REGRESET_SETRESET (0x80) +#define REGRESET_PPCRESET (0x10) +#define REGRESET_M68KRESET (0x08) +#define REGRESET_AMIGARESET (0x04) +#define REGRESET_AUXRESET (0x02) +#define REGRESET_SCSIRESET (0x01) + +#define REGINT_SETRESET (0x80) +#define REGINT_ENABLEIPL (0x02) +#define REGINT_INTMASTER (0x01) + +#define IPLEMU_SETRESET (0x80) +#define IPLEMU_DISABLEINT (0x40) +#define IPLEMU_IPL2 (0x20) +#define IPLEMU_IPL1 (0x10) +#define IPLEMU_IPL0 (0x08) +#define IPLEMU_PPCIPL2 (0x04) +#define IPLEMU_PPCIPL1 (0x02) +#define IPLEMU_PPCIPL0 (0x01) +#define IPLEMU_IPLMASK (IPLEMU_PPCIPL2|IPLEMU_PPCIPL1|IPLEMU_PPCIPL0) + +#endif /* _M68k_AMIGAPPC_H */ diff --git a/include/asm-ppc/bitops.h b/include/asm-ppc/bitops.h index 0a848013d..17fb6383b 100644 --- a/include/asm-ppc/bitops.h +++ b/include/asm-ppc/bitops.h @@ -1,5 +1,5 @@ /* - * $Id: bitops.h,v 1.7 1997/08/03 00:12:07 paulus Exp $ + * $Id: bitops.h,v 1.9 1998/07/26 03:05:28 davem Exp $ * bitops.h: Bit string operations on the ppc */ @@ -96,6 +96,38 @@ extern __inline__ int ffz(unsigned int x) return 31 - n; } +#ifdef __KERNEL__ + +/* + * ffs: find first bit set. This is defined the same way as + * the libc and compiler builtin ffs routines, therefore + * differs in spirit from the above ffz (man ffs). + */ + +#define ffs(x) generic_ffs(x) + +#if 0 +/* untested, someone with PPC knowledge? */ +/* From Alexander Kjeldaas <astor@guardian.no> */ +extern __inline__ int ffs(int x) +{ + int result; + asm ("cntlzw %0,%1" : "=r" (result) : "r" (x)); + return 32 - result; /* IBM backwards ordering of bits */ +} +#endif + +/* + * hweightN: returns the hamming weight (i.e. the number + * of bits set) of a N-bit word + */ + +#define hweight32(x) generic_hweight32(x) +#define hweight16(x) generic_hweight16(x) +#define hweight8(x) generic_hweight8(x) + +#endif /* __KERNEL__ */ + /* * This implementation of find_{first,next}_zero_bit was stolen from * Linus' asm-alpha/bitops.h. diff --git a/include/asm-ppc/bootinfo.h b/include/asm-ppc/bootinfo.h new file mode 100644 index 000000000..8d78bb9cb --- /dev/null +++ b/include/asm-ppc/bootinfo.h @@ -0,0 +1,375 @@ +/* +** asm/bootinfo.h -- Definition of the Linux/m68k boot information structure +** +** Copyright 1992 by Greg Harp +** +** This file is subject to the terms and conditions of the GNU General Public +** License. See the file COPYING in the main directory of this archive +** for more details. +** +** Created 09/29/92 by Greg Harp +** +** 5/2/94 Roman Hodek: +** Added bi_atari part of the machine dependent union bi_un; for now it +** contains just a model field to distinguish between TT and Falcon. +** 26/7/96 Roman Zippel: +** Renamed to setup.h; added some useful macros to allow gcc some +** optimizations if possible. +** 5/10/96 Geert Uytterhoeven: +** Redesign of the boot information structure; renamed to bootinfo.h again +** 27/11/96 Geert Uytterhoeven: +** Backwards compatibility with bootinfo interface version 1.0 +*/ + +#ifndef _BOOTINFO_H +#define _BOOTINFO_H + + + /* + * Bootinfo definitions + * + * This is an easily parsable and extendable structure containing all + * information to be passed from the bootstrap to the kernel. + * + * This way I hope to keep all future changes back/forewards compatible. + * Thus, keep your fingers crossed... + * + * This structure is copied right after the kernel bss by the bootstrap + * routine. + */ + +#ifndef __ASSEMBLY__ + +struct bi_record { + unsigned short tag; /* tag ID */ + unsigned short size; /* size of record (in bytes) */ + unsigned long data[0]; /* data */ +}; + +#else /* __ASSEMBLY__ */ + +BIR_tag = 0 +BIR_size = BIR_tag+2 +BIR_data = BIR_size+2 + +#endif /* __ASSEMBLY__ */ + + + /* + * Tag Definitions + * + * Machine independent tags start counting from 0x0000 + * Machine dependent tags start counting from 0x8000 + */ + +#define BI_LAST 0x0000 /* last record (sentinel) */ +#define BI_MACHTYPE 0x0001 /* machine type (u_long) */ +#define BI_CPUTYPE 0x0002 /* cpu type (u_long) */ +#define BI_FPUTYPE 0x0003 /* fpu type (u_long) */ +#define BI_MMUTYPE 0x0004 /* mmu type (u_long) */ +#define BI_MEMCHUNK 0x0005 /* memory chunk address and size */ + /* (struct mem_info) */ +#define BI_RAMDISK 0x0006 /* ramdisk address and size */ + /* (struct mem_info) */ +#define BI_COMMAND_LINE 0x0007 /* kernel command line parameters */ + /* (string) */ + + /* + * Amiga-specific tags + */ + +#define BI_AMIGA_MODEL 0x8000 /* model (u_long) */ +#define BI_AMIGA_AUTOCON 0x8001 /* AutoConfig device */ + /* (struct ConfigDev) */ +#define BI_AMIGA_CHIP_SIZE 0x8002 /* size of Chip RAM (u_long) */ +#define BI_AMIGA_VBLANK 0x8003 /* VBLANK frequency (u_char) */ +#define BI_AMIGA_PSFREQ 0x8004 /* power supply frequency (u_char) */ +#define BI_AMIGA_ECLOCK 0x8005 /* EClock frequency (u_long) */ +#define BI_AMIGA_CHIPSET 0x8006 /* native chipset present (u_long) */ +#define BI_AMIGA_SERPER 0x8007 /* serial port period (u_short) */ + + /* + * Atari-specific tags + */ + +#define BI_ATARI_MCH_COOKIE 0x8000 /* _MCH cookie from TOS (u_long) */ +#define BI_ATARI_MCH_TYPE 0x8001 /* special machine type (u_long) */ + /* (values are ATARI_MACH_* defines */ + +/* mch_cookie values (upper word) */ +#define ATARI_MCH_ST 0 +#define ATARI_MCH_STE 1 +#define ATARI_MCH_TT 2 +#define ATARI_MCH_FALCON 3 + +/* mch_type values */ +#define ATARI_MACH_NORMAL 0 /* no special machine type */ +#define ATARI_MACH_MEDUSA 1 /* Medusa 040 */ +#define ATARI_MACH_HADES 2 /* Hades 040 or 060 */ +#define ATARI_MACH_AB40 3 /* Afterburner040 on Falcon */ + + /* + * Macintosh-specific tags (all u_long) + */ + +#define BI_MAC_MODEL 0x8000 /* Mac Gestalt ID (model type) */ +#define BI_MAC_VADDR 0x8001 /* Mac video base address */ +#define BI_MAC_VDEPTH 0x8002 /* Mac video depth */ +#define BI_MAC_VROW 0x8003 /* Mac video rowbytes */ +#define BI_MAC_VDIM 0x8004 /* Mac video dimensions */ +#define BI_MAC_VLOGICAL 0x8005 /* Mac video logical base */ +#define BI_MAC_SCCBASE 0x8006 /* Mac SCC base address */ +#define BI_MAC_BTIME 0x8007 /* Mac boot time */ +#define BI_MAC_GMTBIAS 0x8008 /* Mac GMT timezone offset */ +#define BI_MAC_MEMSIZE 0x8009 /* Mac RAM size (sanity check) */ +#define BI_MAC_CPUID 0x800a /* Mac CPU type (sanity check) */ +#define BI_MAC_ROMBASE 0x800b /* Mac system ROM base address */ + + /* + * Macintosh hardware profile data - unused, see macintosh.h for + * resonable type values + */ + +#define BI_MAC_VIA1BASE 0x8010 /* Mac VIA1 base address (always present) */ +#define BI_MAC_VIA2BASE 0x8011 /* Mac VIA2 base address (type varies) */ +#define BI_MAC_VIA2TYPE 0x8012 /* Mac VIA2 type (VIA, RBV, OSS) */ +#define BI_MAC_ADBTYPE 0x8013 /* Mac ADB interface type */ +#define BI_MAC_ASCBASE 0x8014 /* Mac Apple Sound Chip base address */ +#define BI_MAC_SCSI5380 0x8015 /* Mac NCR 5380 SCSI (base address, multi) */ +#define BI_MAC_SCSIDMA 0x8016 /* Mac SCSI DMA (base address) */ +#define BI_MAC_SCSI5396 0x8017 /* Mac NCR 53C96 SCSI (base address, multi) */ +#define BI_MAC_IDETYPE 0x8018 /* Mac IDE interface type */ +#define BI_MAC_IDEBASE 0x8019 /* Mac IDE interface base address */ +#define BI_MAC_NUBUS 0x801a /* Mac Nubus type (none, regular, pseudo) */ +#define BI_MAC_SLOTMASK 0x801b /* Mac Nubus slots present */ +#define BI_MAC_SCCTYPE 0x801c /* Mac SCC serial type (normal, IOP) */ +#define BI_MAC_ETHTYPE 0x801d /* Mac builtin ethernet type (Sonic, MACE */ +#define BI_MAC_ETHBASE 0x801e /* Mac builtin ethernet base address */ +#define BI_MAC_PMU 0x801f /* Mac power managment / poweroff hardware */ +#define BI_MAC_IOP_SWIM 0x8020 /* Mac SWIM floppy IOP */ +#define BI_MAC_IOP_ADB 0x8021 /* Mac ADB IOP */ + + /* + * Mac: compatibility with old booter data format (temporarily) + * Fields unused with the new bootinfo can be deleted now; instead of + * adding new fields the struct might be splitted into a hardware address + * part and a hardware type part + */ + +#ifndef __ASSEMBLY__ + +struct mac_booter_data +{ + unsigned long videoaddr; + unsigned long videorow; + unsigned long videodepth; + unsigned long dimensions; + unsigned long args; + unsigned long boottime; + unsigned long gmtbias; + unsigned long bootver; + unsigned long videological; + unsigned long sccbase; + unsigned long id; + unsigned long memsize; + unsigned long serialmf; + unsigned long serialhsk; + unsigned long serialgpi; + unsigned long printmf; + unsigned long printhsk; + unsigned long printgpi; + unsigned long cpuid; + unsigned long rombase; + unsigned long adbdelay; + unsigned long timedbra; +}; + +extern struct mac_booter_data + mac_bi_data; + +#endif + + /* + * Stuff for bootinfo interface versioning + * + * At the start of kernel code, a 'struct bootversion' is located. + * bootstrap checks for a matching version of the interface before booting + * a kernel, to avoid user confusion if kernel and bootstrap don't work + * together :-) + * + * If incompatible changes are made to the bootinfo interface, the major + * number below should be stepped (and the minor reset to 0) for the + * appropriate machine. If a change is backward-compatible, the minor + * should be stepped. "Backwards-compatible" means that booting will work, + * but certain features may not. + */ + +#define BOOTINFOV_MAGIC 0x4249561A /* 'BIV^Z' */ +#define MK_BI_VERSION(major,minor) (((major)<<16)+(minor)) +#define BI_VERSION_MAJOR(v) (((v) >> 16) & 0xffff) +#define BI_VERSION_MINOR(v) ((v) & 0xffff) + +#ifndef __ASSEMBLY__ + +struct bootversion { + unsigned short branch; + unsigned long magic; + struct { + unsigned long machtype; + unsigned long version; + } machversions[0]; +}; + +#endif /* __ASSEMBLY__ */ + +#define AMIGA_BOOTI_VERSION MK_BI_VERSION( 2, 0 ) +#define ATARI_BOOTI_VERSION MK_BI_VERSION( 2, 1 ) +#define MAC_BOOTI_VERSION MK_BI_VERSION( 2, 0 ) +#define MVME16x_BOOTI_VERSION MK_BI_VERSION( 2, 0 ) +#define BVME6000_BOOTI_VERSION MK_BI_VERSION( 2, 0 ) + + +#ifdef BOOTINFO_COMPAT_1_0 + + /* + * Backwards compatibility with bootinfo interface version 1.0 + */ + +#define COMPAT_AMIGA_BOOTI_VERSION MK_BI_VERSION( 1, 0 ) +#define COMPAT_ATARI_BOOTI_VERSION MK_BI_VERSION( 1, 0 ) +#define COMPAT_MAC_BOOTI_VERSION MK_BI_VERSION( 1, 0 ) + +#include <linux/zorro.h> + +#define COMPAT_NUM_AUTO 16 + +struct compat_bi_Amiga { + int model; + int num_autocon; + struct ConfigDev autocon[COMPAT_NUM_AUTO]; + unsigned long chip_size; + unsigned char vblank; + unsigned char psfreq; + unsigned long eclock; + unsigned long chipset; + unsigned long hw_present; +}; + +struct compat_bi_Atari { + unsigned long hw_present; + unsigned long mch_cookie; +}; + +#ifndef __ASSEMBLY__ + +#define MACHW_DECLARE(name) unsigned name : 1 +#define MACHW_SET(name) (boot_info.bi_mac.hw_present.name = 1) +#define MACHW_PRESENT(name) (boot_info.bi_mac.hw_present.name) + +struct compat_bi_Macintosh +{ + unsigned long videoaddr; + unsigned long videorow; + unsigned long videodepth; + unsigned long dimensions; + unsigned long args; + unsigned long boottime; + unsigned long gmtbias; + unsigned long bootver; + unsigned long videological; + unsigned long sccbase; + unsigned long id; + unsigned long memsize; + unsigned long serialmf; + unsigned long serialhsk; + unsigned long serialgpi; + unsigned long printmf; + unsigned long printhsk; + unsigned long printgpi; + unsigned long cpuid; + unsigned long rombase; + unsigned long adbdelay; + unsigned long timedbra; + struct { + /* video hardware */ + /* sound hardware */ + /* disk storage interfaces */ + MACHW_DECLARE(MAC_SCSI); /* Directly mapped NCR5380 */ + MACHW_DECLARE(IDE); /* IDE Interface */ + /* other I/O hardware */ + MACHW_DECLARE(SCC); /* Serial Communications Contr. */ + /* DMA */ + MACHW_DECLARE(SCSI_DMA); /* DMA for the NCR5380 */ + /* real time clocks */ + MACHW_DECLARE(RTC_CLK); /* clock chip */ + /* supporting hardware */ + MACHW_DECLARE(VIA1); /* Versatile Interface Ad. 1 */ + MACHW_DECLARE(VIA2); /* Versatile Interface Ad. 2 */ + MACHW_DECLARE(RBV); /* Versatile Interface Ad. 2+ */ + /* NUBUS */ + MACHW_DECLARE(NUBUS); /* NUBUS */ + } hw_present; +}; +#else + +#define BI_videoaddr BI_un +#define BI_videorow BI_videoaddr+4 +#define BI_videodepth BI_videorow+4 +#define BI_dimensions BI_videodepth+4 +#define BI_args BI_dimensions+4 +#define BI_cpuid BI_args+56 + +#endif + +struct compat_mem_info { + unsigned long addr; + unsigned long size; +}; + +#define COMPAT_NUM_MEMINFO 4 + +#define COMPAT_CPUB_68020 0 +#define COMPAT_CPUB_68030 1 +#define COMPAT_CPUB_68040 2 +#define COMPAT_CPUB_68060 3 +#define COMPAT_FPUB_68881 5 +#define COMPAT_FPUB_68882 6 +#define COMPAT_FPUB_68040 7 +#define COMPAT_FPUB_68060 8 + +#define COMPAT_CPU_68020 (1<<COMPAT_CPUB_68020) +#define COMPAT_CPU_68030 (1<<COMPAT_CPUB_68030) +#define COMPAT_CPU_68040 (1<<COMPAT_CPUB_68040) +#define COMPAT_CPU_68060 (1<<COMPAT_CPUB_68060) +#define COMPAT_CPU_MASK (31) +#define COMPAT_FPU_68881 (1<<COMPAT_FPUB_68881) +#define COMPAT_FPU_68882 (1<<COMPAT_FPUB_68882) +#define COMPAT_FPU_68040 (1<<COMPAT_FPUB_68040) +#define COMPAT_FPU_68060 (1<<COMPAT_FPUB_68060) +#define COMPAT_FPU_MASK (0xfe0) + +#define COMPAT_CL_SIZE (256) + +struct compat_bootinfo { + unsigned long machtype; + unsigned long cputype; + struct compat_mem_info memory[COMPAT_NUM_MEMINFO]; + int num_memory; + unsigned long ramdisk_size; + unsigned long ramdisk_addr; + char command_line[COMPAT_CL_SIZE]; + union { + struct compat_bi_Amiga bi_ami; + struct compat_bi_Atari bi_ata; + struct compat_bi_Macintosh bi_mac; + } bi_un; +}; + +#define bi_amiga bi_un.bi_ami +#define bi_atari bi_un.bi_ata +#define bi_mac bi_un.bi_mac + +#endif /* BOOTINFO_COMPAT_1_0 */ + + +#endif /* _BOOTINFO_H */ diff --git a/include/asm-ppc/byteorder.h b/include/asm-ppc/byteorder.h index a16503851..ec033ec47 100644 --- a/include/asm-ppc/byteorder.h +++ b/include/asm-ppc/byteorder.h @@ -1,36 +1,44 @@ #ifndef _PPC_BYTEORDER_H #define _PPC_BYTEORDER_H +/* + * $Id: byteorder.h,v 1.13 1998/08/03 19:05:11 geert Exp $ + */ + #include <asm/types.h> #ifdef __GNUC__ -extern inline unsigned ld_le16(volatile unsigned short *addr) +extern __inline__ unsigned ld_le16(volatile unsigned short *addr) { unsigned val; - asm volatile("lhbrx %0,0,%1" : "=r" (val) : "r" (addr)); + __asm__ __volatile__ ("lhbrx %0,0,%1" : "=r" (val) : "r" (addr)); return val; } -extern inline void st_le16(volatile unsigned short *addr, unsigned val) +extern __inline__ void st_le16(volatile unsigned short *addr, unsigned val) { - asm volatile("sthbrx %0,0,%1" : : "r" (val), "r" (addr) : "memory"); + __asm__ __volatile__ ("sthbrx %1,0,%2" : "=m" (*addr) : "r" (val), "r" (addr)); } -extern inline unsigned ld_le32(volatile unsigned *addr) +extern __inline__ unsigned ld_le32(volatile unsigned *addr) { unsigned val; - asm volatile("lwbrx %0,0,%1" : "=r" (val) : "r" (addr)); + __asm__ __volatile__ ("lwbrx %0,0,%1" : "=r" (val) : "r" (addr)); return val; } -extern inline void st_le32(volatile unsigned *addr, unsigned val) +extern __inline__ void st_le32(volatile unsigned *addr, unsigned val) { - asm volatile("stwbrx %0,0,%1" : : "r" (val), "r" (addr) : "memory"); + __asm__ __volatile__ ("stwbrx %1,0,%2" : "=m" (*addr) : "r" (val), "r" (addr)); } +/* alas, egcs sounds like it has a bug in this code that doesn't use the + inline asm correctly, and can cause file corruption. Until I hear that + it's fixed, I can live without the extra speed. I hope. */ +#if !(__GNUC__ >= 2 && __GNUC_MINOR__ >= 90) #if 0 # define __arch_swab16(x) ld_le16(&x) # define __arch_swab32(x) ld_le32(&x) @@ -39,7 +47,7 @@ static __inline__ __const__ __u16 ___arch__swab16(__u16 value) { __u16 result; - asm("rlwimi %0,%1,8,16,23" + __asm__("rlwimi %0,%1,8,16,23" : "=r" (result) : "r" (value), "0" (value >> 8)); return result; @@ -49,7 +57,7 @@ static __inline__ __const__ __u32 ___arch__swab32(__u32 value) { __u32 result; - asm("rlwimi %0,%1,24,16,23\n\t" + __asm__("rlwimi %0,%1,24,16,23\n\t" "rlwimi %0,%1,8,8,15\n\t" "rlwimi %0,%1,24,0,7" : "=r" (result) @@ -60,6 +68,8 @@ static __inline__ __const__ __u32 ___arch__swab32(__u32 value) #define __arch__swab16(x) ___arch__swab16(x) #endif /* 0 */ +#endif + /* The same, but returns converted value from the location pointer by addr. */ #define __arch__swab16p(addr) ld_le16(addr) #define __arch__swab32p(addr) ld_le32(addr) @@ -70,6 +80,9 @@ static __inline__ __const__ __u32 ___arch__swab32(__u32 value) #endif /* __GNUC__ */ +#if defined(__GNUC__) && !defined(__STRICT_ANSI__) +#define __BYTEORDER_HAS_U64__ +#endif #include <linux/byteorder/big_endian.h> #endif /* _PPC_BYTEORDER_H */ diff --git a/include/asm-ppc/cache.h b/include/asm-ppc/cache.h index dd9166390..05017c7eb 100644 --- a/include/asm-ppc/cache.h +++ b/include/asm-ppc/cache.h @@ -46,7 +46,16 @@ static inline void lock_dcache(unsigned long lockit) } #endif /* __ASSEMBLY__ */ - + +/* prep registers for L2 */ +#define CACHECRBA 0x80000823 /* Cache configuration register address */ +#define L2CACHE_MASK 0x03 /* Mask for 2 L2 Cache bits */ +#define L2CACHE_512KB 0x00 /* 512KB */ +#define L2CACHE_256KB 0x01 /* 256KB */ +#define L2CACHE_1MB 0x02 /* 1MB */ +#define L2CACHE_NONE 0x03 /* NONE */ +#define L2CACHE_PARITY 0x08 /* Mask for L2 Cache Parity Protected bit */ + #ifdef CONFIG_8xx /* Cache control on the MPC8xx is provided through some additional * special purpose registers. diff --git a/include/asm-ppc/cuda.h b/include/asm-ppc/cuda.h index 32011e0ca..2bfa7c127 100644 --- a/include/asm-ppc/cuda.h +++ b/include/asm-ppc/cuda.h @@ -37,6 +37,7 @@ #ifdef __KERNEL__ +void find_via_cuda(void); void via_cuda_init(void); int cuda_request(struct adb_request *req, void (*done)(struct adb_request *), int nbytes, ...); diff --git a/include/asm-ppc/delay.h b/include/asm-ppc/delay.h index 74b3d62f7..239e0d3ac 100644 --- a/include/asm-ppc/delay.h +++ b/include/asm-ppc/delay.h @@ -10,6 +10,8 @@ * 2 of the License, or (at your option) any later version. */ +extern unsigned long loops_per_sec; + extern __inline__ void __delay(unsigned int loops) { if (loops != 0) diff --git a/include/asm-ppc/dma.h b/include/asm-ppc/dma.h index 8ee90bdc1..bd55a65da 100644 --- a/include/asm-ppc/dma.h +++ b/include/asm-ppc/dma.h @@ -374,6 +374,7 @@ static __inline__ int get_dma_residue(unsigned int dmanr) } /* These are in kernel/dma.c: */ +extern int request_dma(unsigned int dmanr, const char * device_id); /* reserve a DMA channel */ extern void free_dma(unsigned int dmanr); /* release it again */ #endif /* _ASM_DMA_H */ diff --git a/include/asm-ppc/ide.h b/include/asm-ppc/ide.h index d9e25bace..e7aad0504 100644 --- a/include/asm-ppc/ide.h +++ b/include/asm-ppc/ide.h @@ -11,6 +11,31 @@ #ifndef __ASMPPC_IDE_H #define __ASMPPC_IDE_H +#include <linux/config.h> +#ifdef CONFIG_APUS +#include <linux/hdreg.h> +#include <asm-m68k/ide.h> +void ide_init_hwif_ports(ide_ioreg_t *p, ide_ioreg_t base, int *irq); +void ide_insw(ide_ioreg_t port, void *buf, int ns); +void ide_outsw(ide_ioreg_t port, void *buf, int ns); +#undef insw +#define insw(port, buf, ns) do { \ + if ( _machine != _MACH_Pmac && _machine != _MACH_apus ) \ + /* this must be the same as insw in io.h!! */ \ + _insw((unsigned short *)((port)+_IO_BASE), (buf), (ns)); \ + else \ + ide_insw((port), (buf), (ns)); \ +} while (0) +#undef outsw +#define outsw(port, buf, ns) do { \ + if ( _machine != _MACH_Pmac && _machine != _MACH_apus ) \ + /* this must be the same as outsw in io.h!! */ \ + _outsw((unsigned short *)((port)+_IO_BASE), (buf), (ns)); \ + else \ + ide_outsw((port), (buf), (ns)); \ +} while (0) +#else /* CONFIG_APUS */ + #ifdef __KERNEL__ #include <linux/ioport.h> @@ -186,5 +211,6 @@ static __inline__ void ide_free_irq(unsigned int irq, void *dev_id) #define ide_get_lock(lock, hdlr, data) do {} while (0) #endif /* __KERNEL__ */ +#endif /* CONFIG_APUS */ #endif /* __ASMPPC_IDE_H */ diff --git a/include/asm-ppc/init.h b/include/asm-ppc/init.h index 09b38d899..ea24bbab7 100644 --- a/include/asm-ppc/init.h +++ b/include/asm-ppc/init.h @@ -1,23 +1,56 @@ #ifndef _PPC_INIT_H #define _PPC_INIT_H -#define __init -#define __initdata -#define __initfunc(x) x -/* +#if __GNUC__ > 2 || __GNUC_MINOR__ >= 90 /* egcs */ #define __init __attribute__ ((__section__ (".text.init"))) #define __initdata __attribute__ ((__section__ (".data.init"))) #define __initfunc(__arginit) \ __arginit __init; \ __arginit -*/ - /* For assembly routines */ -#define __INIT -#define __FINIT -#define __INITDATA -/* + +#define __pmac __attribute__ ((__section__ (".text.pmac"))) +#define __pmacdata __attribute__ ((__section__ (".data.pmac"))) +#define __pmacfunc(__argpmac) \ + __argpmac __pmac; \ + __argpmac + +#define __prep __attribute__ ((__section__ (".text.prep"))) +#define __prepdata __attribute__ ((__section__ (".data.prep"))) +#define __prepfunc(__argprep) \ + __argprep __prep; \ + __argprep + +/* this is actually just common chrp/pmac code, not OF code -- Cort */ +#define __openfirmware __attribute__ ((__section__ (".text.openfirmware"))) +#define __openfirmwaredata __attribute__ ((__section__ (".data.openfirmware"))) +#define __openfirmwarefunc(__argopenfirmware) \ + __argopenfirmware __openfirmware; \ + __argopenfirmware + #define __INIT .section ".text.init",#alloc,#execinstr #define __FINIT .previous #define __INITDATA .section ".data.init",#alloc,#write -*/ + +#else /* not egcs */ + +#define __init +#define __initdata +#define __initfunc(x) x + +#define __INIT +#define __FINIT +#define __INITDATA + +#define __pmac +#define __pmacdata +#define __pmacfunc(x) x + +#define __prep +#define __prepdata +#define __prepfunc(x) x + +#define __openfirmware +#define __openfirmwaredata +#define __openfirmwarefunc(x) x +#endif /* egcs */ #endif diff --git a/include/asm-ppc/io.h b/include/asm-ppc/io.h index e52ddf0be..8f26f192c 100644 --- a/include/asm-ppc/io.h +++ b/include/asm-ppc/io.h @@ -22,6 +22,9 @@ #define PMAC_ISA_MEM_BASE 0 #define PMAC_PCI_DRAM_OFFSET 0 +#define APUS_ISA_IO_BASE 0 +#define APUS_ISA_MEM_BASE 0 +#define APUS_PCI_DRAM_OFFSET 0 #define CHRP_ISA_IO_BASE 0xf8000000 #define CHRP_ISA_MEM_BASE 0xf7000000 #define CHRP_PCI_DRAM_OFFSET 0 @@ -30,47 +33,32 @@ /*#define PREP_ISA_MEM_BASE 0xc0000000*/ #define PREP_PCI_DRAM_OFFSET 0x80000000 -#if defined(CONFIG_MACH_SPECIFIC) -#ifdef CONFIG_PREP -#define _IO_BASE PREP_ISA_IO_BASE -#define _ISA_MEM_BASE PREP_ISA_MEM_BASE -#define PCI_DRAM_OFFSET PREP_PCI_DRAM_OFFSET -#endif /* CONFIG_PREP */ - -#ifdef CONFIG_CHRP -#define _IO_BASE CHRP_ISA_IO_BASE -#define _ISA_MEM_BASE CHRP_ISA_MEM_BASE -#define PCI_DRAM_OFFSET CHRP_PCI_DRAM_OFFSET -#endif /* CONFIG_CHRP */ - -#ifdef CONFIG_PMAC -extern unsigned long isa_io_base; -#define _IO_BASE isa_io_base /* well, PCI i/o base really */ -#define _ISA_MEM_BASE PMAC_ISA_MEM_BASE -#define PCI_DRAM_OFFSET PMAC_PCI_DRAM_OFFSET -#endif /* CONFIG_PMAC */ - #ifdef CONFIG_MBX #define _IO_BASE 0 #define _ISA_MEM_BASE 0 #define PCI_DRAM_OFFSET 0x80000000 -#endif /* CONFIG_MBX8xx */ - -#else /* CONFIG_MACH_SPECIFIC */ +#else /* CONFIG_MBX8xx */ extern unsigned long isa_io_base; -#define _IO_BASE isa_io_base extern unsigned long isa_mem_base; -#define _ISA_MEM_BASE isa_mem_base -#undef PCI_DRAM_OFFSET -#define PCI_DRAM_OFFSET pci_dram_offset extern unsigned long pci_dram_offset; -#endif /* CONFIG_MACH_SPECIFIC */ +#define _IO_BASE isa_io_base +#define _ISA_MEM_BASE isa_mem_base +#define PCI_DRAM_OFFSET pci_dram_offset +#endif /* CONFIG_MBX8xx */ + #define readb(addr) (*(volatile unsigned char *) (addr)) +#define writeb(b,addr) ((*(volatile unsigned char *) (addr)) = (b)) +#if defined(CONFIG_APUS) +#define readw(addr) (*(volatile unsigned short *) (addr)) +#define readl(addr) (*(volatile unsigned int *) (addr)) +#define writew(b,addr) ((*(volatile unsigned short *) (addr)) = (b)) +#define writel(b,addr) ((*(volatile unsigned int *) (addr)) = (b)) +#else #define readw(addr) ld_le16((volatile unsigned short *)(addr)) #define readl(addr) ld_le32((volatile unsigned *)addr) -#define writeb(b,addr) ((*(volatile unsigned char *) (addr)) = (b)) #define writew(b,addr) st_le16((volatile unsigned short *)(addr),(b)) #define writel(b,addr) st_le32((volatile unsigned *)(addr),(b)) +#endif #define insb(port, buf, ns) _insb((unsigned char *)((port)+_IO_BASE), (buf), (ns)) #define outsb(port, buf, ns) _outsb((unsigned char *)((port)+_IO_BASE), (buf), (ns)) @@ -81,10 +69,17 @@ extern unsigned long pci_dram_offset; #define inb(port) in_8((unsigned char *)((port)+_IO_BASE)) #define outb(val, port) out_8((unsigned char *)((port)+_IO_BASE), (val)) +#if defined(CONFIG_APUS) +#define inw(port) in_be16((unsigned short *)((port)+_IO_BASE)) +#define outw(val, port) out_be16((unsigned short *)((port)+_IO_BASE), (val)) +#define inl(port) in_be32((unsigned *)((port)+_IO_BASE)) +#define outl(val, port) out_be32((unsigned *)((port)+_IO_BASE), (val)) +#else #define inw(port) in_le16((unsigned short *)((port)+_IO_BASE)) #define outw(val, port) out_le16((unsigned short *)((port)+_IO_BASE), (val)) #define inl(port) in_le32((unsigned *)((port)+_IO_BASE)) #define outl(val, port) out_le32((unsigned *)((port)+_IO_BASE), (val)) +#endif #define inb_p(port) in_8((unsigned char *)((port)+_IO_BASE)) #define outb_p(val, port) out_8((unsigned char *)((port)+_IO_BASE), (val)) @@ -100,12 +95,38 @@ extern void _outsw(volatile unsigned short *port, const void *buf, int ns); extern void _insl(volatile unsigned long *port, void *buf, int nl); extern void _outsl(volatile unsigned long *port, const void *buf, int nl); +/* + * The *_ns versions below don't do byte-swapping. + */ +#define insw_ns(port, buf, ns) _insw_ns((unsigned short *)((port)+_IO_BASE), (buf), (ns)) +#define outsw_ns(port, buf, ns) _outsw_ns((unsigned short *)((port)+_IO_BASE), (buf), (ns)) +#define insl_ns(port, buf, nl) _insl_ns((unsigned long *)((port)+_IO_BASE), (buf), (nl)) +#define outsl_ns(port, buf, nl) _outsl_ns((unsigned long *)((port)+_IO_BASE), (buf), (nl)) + +extern void _insw_ns(volatile unsigned short *port, void *buf, int ns); +extern void _outsw_ns(volatile unsigned short *port, const void *buf, int ns); +extern void _insl_ns(volatile unsigned long *port, void *buf, int nl); +extern void _outsl_ns(volatile unsigned long *port, const void *buf, int nl); + #define memset_io(a,b,c) memset((a),(b),(c)) #define memcpy_fromio(a,b,c) memcpy((a),(b),(c)) #define memcpy_toio(a,b,c) memcpy((a),(b),(c)) #ifdef __KERNEL__ /* + * Map in an area of physical address space, for accessing + * I/O devices etc. + */ +extern void *__ioremap(unsigned long address, unsigned long size, + unsigned long flags); +extern void *ioremap(unsigned long address, unsigned long size); +extern void iounmap(void *addr); +extern unsigned long iopa(unsigned long addr); +#ifdef CONFIG_APUS +extern unsigned long mm_ptov(unsigned long addr) __attribute__ ((const)); +#endif + +/* * The PCI bus is inherently Little-Endian. The PowerPC is being * run Big-Endian. Thus all values which cross the [PCI] barrier * must be endian-adjusted. Also, the local DRAM has a different @@ -114,40 +135,62 @@ extern void _outsl(volatile unsigned long *port, const void *buf, int nl); */ extern inline unsigned long virt_to_bus(volatile void * address) { +#ifndef CONFIG_APUS if (address == (void *)0) return 0; return (unsigned long)address - KERNELBASE + PCI_DRAM_OFFSET; +#else + return iopa ((unsigned long) address); +#endif } extern inline void * bus_to_virt(unsigned long address) { +#ifndef CONFIG_APUS if (address == 0) return 0; return (void *)(address - PCI_DRAM_OFFSET + KERNELBASE); +#else + return (void*) mm_ptov (address); +#endif } /* - * Map in an area of physical address space, for accessing - * I/O devices etc. - */ -extern void *__ioremap(unsigned long address, unsigned long size, - unsigned long flags); -extern void *ioremap(unsigned long address, unsigned long size); -extern void iounmap(void *addr); -extern unsigned long iopa(unsigned long addr); - -/* * Change virtual addresses to physical addresses and vv, for * addresses in the area where the kernel has the RAM mapped. */ extern inline unsigned long virt_to_phys(volatile void * address) { +#ifndef CONFIG_APUS return (unsigned long) address - KERNELBASE; +#else + return iopa ((unsigned long) address); +#endif } extern inline void * phys_to_virt(unsigned long address) { +#ifndef CONFIG_APUS return (void *) (address + KERNELBASE); +#else + return (void*) mm_ptov (address); +#endif +} + +static inline int check_signature(unsigned long io_addr, + const unsigned char *signature, int length) +{ + int retval = 0; + do { + if (readb(io_addr) != *signature) + goto out; + io_addr++; + signature++; + length--; + } while (length); + retval = 1; +out: + return retval; } #endif /* __KERNEL__ */ @@ -159,7 +202,7 @@ extern inline void * phys_to_virt(unsigned long address) */ extern inline void eieio(void) { - asm volatile ("eieio" : :); + __asm__ __volatile__ ("eieio" : : : "memory" ); } /* @@ -169,23 +212,26 @@ extern inline int in_8(volatile unsigned char *addr) { int ret; + __asm__ __volatile__ ("" : "=m" (*addr) : "0" (*addr) ); ret = *addr; - eieio(); + __asm__ __volatile__ ("eieio" : "=m" (*addr) : "0" (*addr) ); return ret; } extern inline void out_8(volatile unsigned char *addr, int val) { + __asm__ __volatile__ ("" : "=m" (*addr) : "0" (*addr) ); *addr = val; - eieio(); + __asm__ __volatile__ ("eieio" : "=m" (*addr) : "0" (*addr) ); } extern inline int in_le16(volatile unsigned short *addr) { int ret; + __asm__ __volatile__ ("" : "=m" (*addr) : "0" (*addr) ); ret = ld_le16(addr); - eieio(); + __asm__ __volatile__ ("eieio" : "=m" (*addr) : "0" (*addr) ); return ret; } @@ -193,29 +239,33 @@ extern inline int in_be16(volatile unsigned short *addr) { int ret; + __asm__ __volatile__ ("" : "=m" (*addr) : "0" (*addr) ); ret = *addr; - eieio(); + __asm__ __volatile__ ("eieio" : "=m" (*addr) : "0" (*addr) ); return ret; } extern inline void out_le16(volatile unsigned short *addr, int val) { + __asm__ __volatile__ ("" : "=m" (*addr) : "0" (*addr) ); st_le16(addr, val); - eieio(); + __asm__ __volatile__ ("eieio" : "=m" (*addr) : "0" (*addr) ); } extern inline void out_be16(volatile unsigned short *addr, int val) { + __asm__ __volatile__ ("" : "=m" (*addr) : "0" (*addr) ); *addr = val; - eieio(); + __asm__ __volatile__ ("eieio" : "=m" (*addr) : "0" (*addr) ); } extern inline unsigned in_le32(volatile unsigned *addr) { unsigned ret; + __asm__ __volatile__ ("" : "=m" (*addr) : "0" (*addr) ); ret = ld_le32(addr); - eieio(); + __asm__ __volatile__ ("eieio" : "=m" (*addr) : "0" (*addr) ); return ret; } @@ -223,21 +273,24 @@ extern inline int in_be32(volatile unsigned *addr) { int ret; + __asm__ __volatile__ ("" : "=m" (*addr) : "0" (*addr) ); ret = *addr; - eieio(); + __asm__ __volatile__ ("eieio" : "=m" (*addr) : "0" (*addr) ); return ret; } extern inline void out_le32(volatile unsigned *addr, int val) { + __asm__ __volatile__ ("" : "=m" (*addr) : "0" (*addr) ); st_le32(addr, val); - eieio(); + __asm__ __volatile__ ("eieio" : "=m" (*addr) : "0" (*addr) ); } extern inline void out_be32(volatile unsigned *addr, int val) { + __asm__ __volatile__ ("" : "=m" (*addr) : "0" (*addr) ); *addr = val; - eieio(); + __asm__ __volatile__ ("eieio" : "=m" (*addr) : "0" (*addr) ); } #endif diff --git a/include/asm-ppc/irq.h b/include/asm-ppc/irq.h index 4ae880c98..be13bd34a 100644 --- a/include/asm-ppc/irq.h +++ b/include/asm-ppc/irq.h @@ -3,13 +3,21 @@ #ifndef _ASM_IRQ_H #define _ASM_IRQ_H +#include <asm/processor.h> /* for is_prep() */ + #ifndef CONFIG_8xx + +#ifdef CONFIG_APUS +#include <asm-m68k/irq.h> +#else /* CONFIG_APUS */ + /* * this is the # irq's for all ppc arch's (pmac/chrp/prep) - * so it is the max of them all - which happens to be chrp - * -- Cort + * so it is the max of them all - which happens to be powermac + * at present (G3 powermacs have 64). */ -#define NR_IRQS (NUM_8259_INTERRUPTS+NUM_OPENPIC_INTERRUPTS) +#define NR_IRQS 64 +#endif /* CONFIG_APUS */ #define NUM_8259_INTERRUPTS 16 #define NUM_OPENPIC_INTERRUPTS 20 @@ -18,13 +26,20 @@ #define irq_to_openpic(n) ((n)-NUM_8259_INTERRUPTS) #define IRQ_8259_CASCADE NUM_8259_INTERRUPTS +extern void disable_irq(unsigned int); +extern void enable_irq(unsigned int); + +#ifndef CONFIG_APUS +/* + * This gets called from serial.c, which is now used on + * powermacs as well as prep/chrp boxes. + * Prep and chrp both have cascaded 8259 PICs. + */ static __inline__ int irq_cannonicalize(int irq) { - return irq; + return (((is_prep || is_chrp) && irq == 2) ? 9 : irq); } - -extern void disable_irq(unsigned int); -extern void enable_irq(unsigned int); +#endif #else /* CONFIG_8xx */ @@ -80,6 +95,12 @@ extern void enable_irq(unsigned int); #define STOP_ABRT_INT SIU_IRQ7 /* Stop/Abort header pin */ #endif /* CONFIG_MBX */ +/* always the same on MBX -- Cort */ +static __inline__ int irq_cannonicalize(int irq) +{ + return irq; +} + #endif /* CONFIG_8xx */ #endif diff --git a/include/asm-ppc/keyboard.h b/include/asm-ppc/keyboard.h index 0d3783e2a..7b40d6100 100644 --- a/include/asm-ppc/keyboard.h +++ b/include/asm-ppc/keyboard.h @@ -3,7 +3,7 @@ * * Created 3 Nov 1996 by Geert Uytterhoeven * - * $Id: keyboard.h,v 1.5 1998/05/04 12:43:22 ralf Exp $ + * $Id: keyboard.h,v 1.6 1998/08/20 14:41:03 ralf Exp $ * Modified for Power Macintosh by Paul Mackerras */ @@ -22,6 +22,10 @@ #include <linux/config.h> #include <asm/adb.h> +#ifdef CONFIG_APUS +#include <asm-m68k/keyboard.h> +#else + #define KEYBOARD_IRQ 1 #define DISABLE_KBD_DURING_INTERRUPTS 0 #define INIT_KBD @@ -172,6 +176,8 @@ static inline void kbd_init_hw(void) mackbd_init_hw(); } +#endif /* CONFIG_APUS */ + /* How to access the keyboard macros on this platform. */ #define kbd_read_input() inb(KBD_DATA_REG) #define kbd_read_status() inb(KBD_STATUS_REG) diff --git a/include/asm-ppc/linux_logo.h b/include/asm-ppc/linux_logo.h index 02a237a2c..33ad40f64 100644 --- a/include/asm-ppc/linux_logo.h +++ b/include/asm-ppc/linux_logo.h @@ -17,1445 +17,13 @@ #define LINUX_LOGO_HEIGHT 80 #define LINUX_LOGO_WIDTH 80 -#define LINUX_LOGO_COLORS 221 +#define LINUX_LOGO_COLORS 214 #ifdef INCLUDE_LINUX_LOGO_DATA -unsigned char linux_logo_red[] __initdata = { - 0xF3, 0xF6, 0xF8, 0xF7, 0xEF, 0xE7, 0xE5, 0xE3, - 0xCA, 0xD4, 0xDD, 0xC8, 0xC7, 0xC4, 0xC2, 0xE5, - 0xF1, 0xED, 0xEE, 0xE6, 0xC6, 0xDA, 0xDD, 0xE5, - 0xD9, 0xC6, 0xE3, 0xD0, 0xC6, 0xBA, 0xB0, 0xB6, - 0xBB, 0xBE, 0xB9, 0xB8, 0xB3, 0xB2, 0xB0, 0xAD, - 0xAC, 0xA9, 0xA8, 0xA6, 0xA4, 0xA1, 0xA0, 0x9D, - 0xA0, 0x9F, 0x9E, 0x9C, 0x9B, 0x99, 0x9A, 0x99, - 0x98, 0x95, 0x96, 0x94, 0x93, 0x92, 0x8F, 0x8D, - 0x8C, 0x8A, 0x87, 0x86, 0x83, 0x81, 0x0D, 0x03, - 0x66, 0x44, 0x24, 0x08, 0xD6, 0xE6, 0xE9, 0xE6, - 0xE7, 0xCA, 0xDC, 0xDB, 0xD5, 0xD0, 0xC9, 0xE2, - 0xD5, 0xC6, 0xC4, 0xB3, 0xB2, 0xB9, 0xA9, 0x9A, - 0xB2, 0x9D, 0xE8, 0xEC, 0xF5, 0xF5, 0xF4, 0xF4, - 0xEC, 0xEE, 0xF0, 0xF5, 0xE0, 0xD6, 0xC5, 0xC2, - 0xD9, 0xD5, 0xD8, 0xD6, 0xF6, 0xF4, 0xED, 0xEC, - 0xEB, 0xF1, 0xF6, 0xF5, 0xF5, 0xEE, 0xEF, 0xEC, - 0xE7, 0xE3, 0xE6, 0xD6, 0xDD, 0xC3, 0xD6, 0xD7, - 0xCD, 0xCA, 0xC3, 0xAC, 0x95, 0x99, 0xB7, 0xA3, - 0x8B, 0x88, 0x95, 0x8A, 0x94, 0xD2, 0xCC, 0xC4, - 0xA8, 0x8E, 0x8F, 0xAE, 0xB8, 0xAC, 0xB6, 0xB4, - 0xAD, 0xA5, 0xA0, 0x9B, 0x8B, 0xA3, 0x94, 0x87, - 0x85, 0x89, 0x53, 0x80, 0x7D, 0x7C, 0x7A, 0x78, - 0x76, 0x71, 0x73, 0x6E, 0x6B, 0x67, 0x65, 0x62, - 0x4B, 0x5B, 0x5F, 0x53, 0x56, 0x52, 0x4F, 0x46, - 0x42, 0x0F, 0x75, 0x78, 0x7D, 0x72, 0x5F, 0x6E, - 0x7A, 0x75, 0x6A, 0x58, 0x48, 0x4F, 0x00, 0x2B, - 0x37, 0x3E, 0x32, 0x33, 0x25, 0x2C, 0x3B, 0x11, - 0x1D, 0x14, 0x06, 0x02, 0x00 -}; -unsigned char linux_logo_green[] __initdata = { - 0xF3, 0xF6, 0xF8, 0xF7, 0xEF, 0xE7, 0xE5, 0xE3, - 0xCA, 0xD4, 0xDD, 0xC8, 0xC7, 0xC4, 0xC2, 0xD3, - 0xDA, 0xD4, 0xD7, 0xCC, 0xC1, 0xCC, 0xCB, 0xC9, - 0xC5, 0xBC, 0xBC, 0xBB, 0xB7, 0xA5, 0xB0, 0xB6, - 0xBB, 0xBE, 0xB9, 0xB8, 0xB3, 0xB2, 0xAD, 0xAD, - 0xAC, 0xA9, 0xA8, 0xA6, 0xA4, 0xA1, 0xA0, 0x95, - 0xA0, 0x9F, 0x9E, 0x9C, 0x9B, 0x99, 0x9A, 0x99, - 0x98, 0x95, 0x96, 0x94, 0x93, 0x92, 0x8F, 0x8D, - 0x8C, 0x8A, 0x87, 0x86, 0x83, 0x81, 0x08, 0x02, - 0x53, 0x2E, 0x19, 0x06, 0xC6, 0xC8, 0xCF, 0xBD, - 0xB3, 0xB6, 0xB4, 0xAB, 0xA5, 0xA3, 0x9B, 0xB6, - 0xA7, 0x99, 0x92, 0xA4, 0x9E, 0x9D, 0x98, 0x8C, - 0x8A, 0x86, 0xCD, 0xCC, 0xC9, 0xD7, 0xCA, 0xC4, - 0xCA, 0xC3, 0xC7, 0xC3, 0xC8, 0xB4, 0x91, 0x8E, - 0x8A, 0x82, 0x87, 0x85, 0xBD, 0xBF, 0xB6, 0xBC, - 0xAE, 0xB7, 0xBC, 0xB8, 0xBF, 0xB6, 0xBC, 0xB5, - 0xAB, 0xA6, 0xAD, 0xB2, 0xA5, 0x87, 0x9C, 0x96, - 0x95, 0x8E, 0x87, 0x8F, 0x86, 0x86, 0x8E, 0x80, - 0x7A, 0x70, 0x7B, 0x78, 0x78, 0x7F, 0x77, 0x6F, - 0x70, 0x76, 0x59, 0x77, 0x68, 0x64, 0x7B, 0x7C, - 0x75, 0x6D, 0x77, 0x69, 0x65, 0x5F, 0x5B, 0x54, - 0x4F, 0x5B, 0x39, 0x80, 0x7D, 0x7C, 0x7A, 0x78, - 0x76, 0x71, 0x73, 0x6E, 0x6B, 0x67, 0x65, 0x62, - 0x4B, 0x5B, 0x5F, 0x53, 0x56, 0x52, 0x4F, 0x46, - 0x42, 0x0B, 0x69, 0x66, 0x64, 0x57, 0x4A, 0x4E, - 0x55, 0x4B, 0x46, 0x3B, 0x30, 0x33, 0x00, 0x2B, - 0x37, 0x3E, 0x32, 0x33, 0x25, 0x2C, 0x29, 0x0D, - 0x1D, 0x14, 0x06, 0x02, 0x00 -}; - -unsigned char linux_logo_blue[] __initdata = { - 0xF3, 0xF6, 0xF8, 0xF7, 0xEF, 0xEE, 0xE5, 0xDE, - 0xD7, 0xD3, 0xDD, 0xC8, 0xC7, 0xC4, 0xC2, 0xB5, - 0xB0, 0xA6, 0xAC, 0x9B, 0xB5, 0xB5, 0xAE, 0x84, - 0x90, 0xA9, 0x81, 0x8D, 0x96, 0x86, 0xB0, 0xB6, - 0xBB, 0xBE, 0xB9, 0xB8, 0xB3, 0xB2, 0xA7, 0xAD, - 0xAC, 0xA9, 0xA8, 0xA6, 0xA4, 0xA1, 0xA5, 0x87, - 0xA0, 0x9F, 0x9E, 0x9C, 0x9B, 0x9A, 0x9A, 0x99, - 0x98, 0x95, 0x96, 0x94, 0x93, 0x92, 0x8F, 0x8D, - 0x8C, 0x8A, 0x87, 0x86, 0x83, 0x81, 0xC8, 0xD7, - 0x9B, 0x8E, 0x8C, 0xB2, 0x77, 0x77, 0x4E, 0x77, - 0x69, 0x71, 0x78, 0x6B, 0x65, 0x66, 0x64, 0x59, - 0x5C, 0x5A, 0x48, 0x72, 0x7B, 0x6B, 0x67, 0x6E, - 0x42, 0x5B, 0x29, 0x36, 0x25, 0x10, 0x17, 0x14, - 0x19, 0x16, 0x13, 0x0E, 0x08, 0x2E, 0x2E, 0x3D, - 0x24, 0x24, 0x24, 0x24, 0x13, 0x12, 0x14, 0x14, - 0x0E, 0x08, 0x0D, 0x0F, 0x08, 0x0D, 0x0E, 0x08, - 0x08, 0x0C, 0x06, 0x06, 0x07, 0x16, 0x07, 0x0E, - 0x08, 0x0A, 0x07, 0x0D, 0x2D, 0x3E, 0x09, 0x4E, - 0x68, 0x52, 0x56, 0x58, 0x4B, 0x22, 0x20, 0x20, - 0x27, 0x39, 0x28, 0x19, 0x1E, 0x1E, 0x08, 0x06, - 0x07, 0x09, 0x08, 0x08, 0x05, 0x1D, 0x1F, 0x17, - 0x18, 0x06, 0x79, 0x80, 0x7D, 0x7C, 0x7A, 0x78, - 0x76, 0x71, 0x73, 0x6E, 0x6B, 0x68, 0x65, 0x62, - 0x4B, 0x5B, 0x5F, 0x55, 0x56, 0x52, 0x4F, 0x46, - 0x42, 0x5A, 0x14, 0x23, 0x3D, 0x2B, 0x21, 0x14, - 0x06, 0x04, 0x03, 0x07, 0x09, 0x13, 0x2A, 0x3A, - 0x37, 0x3E, 0x32, 0x33, 0x25, 0x2C, 0x07, 0x09, - 0x1D, 0x14, 0x06, 0x02, 0x00 -}; - -unsigned char linux_logo[] __initdata = { - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x58, 0x57, - 0x58, 0x58, 0x59, 0x5C, 0x5D, 0x5F, 0x60, 0x61, - 0x62, 0x61, 0x61, 0x62, 0x62, 0x62, 0x63, 0x63, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x60, 0x5E, 0x5E, - 0x5E, 0x5D, 0x5D, 0x5C, 0x5D, 0x5B, 0x58, 0x58, - 0x58, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x58, - 0x57, 0x57, 0x58, 0x57, 0x57, 0x58, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x58, 0x57, - 0x54, 0x56, 0x57, 0x67, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0x67, 0x4C, - 0x4A, 0x49, 0x4A, 0x49, 0x4A, 0x49, 0x49, 0x4A, - 0x4A, 0x4B, 0x4B, 0x4B, 0x4C, 0x50, 0x51, 0x52, - 0x54, 0x54, 0x56, 0x57, 0x57, 0x57, 0x57, 0x58, - 0x57, 0x57, 0x58, 0x57, 0x57, 0x58, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x58, 0x56, 0x56, 0x53, - 0x52, 0x53, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFB, 0xFB, 0xFB, - 0x4B, 0x4B, 0x4B, 0x4A, 0x49, 0x4A, 0x4A, 0x49, - 0x49, 0x49, 0x48, 0x49, 0x49, 0x4A, 0x4A, 0x4B, - 0x4C, 0x4D, 0x52, 0x54, 0x56, 0x55, 0x57, 0x58, - 0x57, 0x57, 0x58, 0x57, 0x57, 0x58, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x55, 0x54, 0x53, 0x52, 0x51, 0x50, - 0x50, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xF8, 0xF0, 0xF4, 0xFB, - 0xFC, 0x67, 0x53, 0x50, 0x4D, 0x4C, 0x4C, 0x4C, - 0x4B, 0x4A, 0x4A, 0x48, 0x49, 0x48, 0x48, 0x49, - 0x49, 0x49, 0x4B, 0x4C, 0x50, 0x52, 0x53, 0x56, - 0x57, 0x57, 0x58, 0x57, 0x57, 0x58, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x55, 0x54, 0x53, 0x51, 0x51, 0x50, 0x4C, 0x4D, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xF4, 0xD2, 0xD7, 0xF5, - 0xFC, 0xFC, 0x5D, 0x5D, 0x5C, 0x5C, 0x59, 0x58, - 0x58, 0x56, 0x52, 0x4C, 0x4B, 0x4A, 0x4A, 0x48, - 0x48, 0x48, 0x48, 0x48, 0x49, 0x4B, 0x4D, 0x51, - 0x54, 0x56, 0x58, 0x57, 0x57, 0x58, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x55, 0x54, - 0x53, 0x52, 0x51, 0x4D, 0x4D, 0x4D, 0x50, 0x50, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xF4, 0x64, 0xD9, 0xF5, - 0xF9, 0xFC, 0xFC, 0x64, 0x63, 0x62, 0x61, 0x61, - 0x61, 0x60, 0x5E, 0x5B, 0x5A, 0x54, 0x52, 0x4C, - 0x4B, 0x49, 0x49, 0x47, 0x47, 0x48, 0x49, 0x4B, - 0x4C, 0x51, 0x53, 0x56, 0x57, 0x58, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x58, 0x57, 0x57, 0x55, 0x53, 0x53, - 0x51, 0x50, 0x50, 0x50, 0x50, 0x50, 0x53, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xF4, 0xF5, 0xF9, 0xFC, - 0xFC, 0xFC, 0xFC, 0x64, 0x64, 0x64, 0x64, 0x64, - 0x64, 0x64, 0x64, 0x63, 0x61, 0x61, 0x5E, 0x59, - 0x55, 0x52, 0x4C, 0x4A, 0x49, 0x47, 0x48, 0x48, - 0x49, 0x4B, 0x4D, 0x51, 0x54, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x58, 0x55, 0x54, 0x54, 0x52, 0x51, - 0x51, 0x51, 0x51, 0x51, 0x53, 0x54, 0x59, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xF7, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0x60, 0x60, 0x60, 0x61, - 0x62, 0x63, 0x64, 0x64, 0x65, 0x65, 0x64, 0x63, - 0x61, 0x5E, 0x59, 0x56, 0x4D, 0x4B, 0x48, 0x48, - 0x48, 0x48, 0x49, 0x4B, 0x50, 0x53, 0x56, 0x56, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x56, 0x54, 0x53, 0x52, 0x51, 0x51, - 0x51, 0x52, 0x53, 0x55, 0x59, 0x5D, 0x5E, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFB, 0xFB, 0xFB, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0x4C, 0x4E, 0x51, 0x52, - 0x57, 0x5A, 0x5E, 0x60, 0x61, 0x63, 0x65, 0xCB, - 0x64, 0x64, 0x63, 0x60, 0x5C, 0x57, 0x50, 0x4B, - 0x48, 0x47, 0x47, 0x47, 0x4A, 0x4C, 0x52, 0x53, - 0x54, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x55, 0x54, 0x53, 0x53, 0x51, 0x52, 0x52, 0x53, - 0x53, 0x57, 0x5A, 0x5D, 0x5E, 0x5E, 0x60, 0xFC, - 0xFC, 0xFC, 0xFB, 0xF9, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFA, 0xF9, 0xF5, 0xFB, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFB, 0x45, 0x3F, 0x3F, - 0x45, 0x48, 0x4B, 0x4D, 0x54, 0x5A, 0x5E, 0x61, - 0x63, 0xCB, 0xCB, 0x65, 0x64, 0x62, 0x5E, 0x57, - 0x50, 0x4B, 0x48, 0x47, 0x47, 0x48, 0x4B, 0x4D, - 0x51, 0x56, 0x56, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x55, - 0x54, 0x54, 0x53, 0x53, 0x52, 0x53, 0x54, 0x57, - 0x59, 0x5C, 0x5E, 0x5E, 0x5E, 0x5E, 0x5E, 0xFC, - 0xFC, 0xFA, 0xFC, 0xFA, 0xE0, 0xFC, 0xFC, 0xFC, - 0xFB, 0xFB, 0xFB, 0xDF, 0xD8, 0xF9, 0xE0, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFB, 0x4C, 0x4A, 0x48, - 0x48, 0x3E, 0x44, 0x43, 0x3F, 0x47, 0x4B, 0x52, - 0x5A, 0x5E, 0x62, 0x64, 0xCB, 0xCB, 0x64, 0x61, - 0x5E, 0x57, 0x4D, 0x49, 0x47, 0x47, 0x48, 0x4A, - 0x4C, 0x52, 0x54, 0x56, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x55, - 0x54, 0x53, 0x53, 0x54, 0x54, 0x55, 0x58, 0x5B, - 0x5C, 0x5D, 0x5E, 0x5D, 0x5D, 0x5B, 0x58, 0xFC, - 0xFC, 0xD8, 0x4C, 0x60, 0xFC, 0xF5, 0xFC, 0xFC, - 0xFC, 0xF7, 0x5F, 0x48, 0x48, 0x2C, 0xF8, 0xF9, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0x4B, 0x4A, 0x49, - 0x49, 0x49, 0x49, 0x47, 0x3E, 0x44, 0x42, 0x3F, - 0x3E, 0x4B, 0x54, 0x5C, 0x61, 0x64, 0xCB, 0xCB, - 0x64, 0x61, 0x5D, 0x53, 0x4B, 0x49, 0x47, 0x47, - 0x49, 0x4B, 0x50, 0x53, 0x56, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x55, 0x55, 0x54, - 0x53, 0x53, 0x54, 0x56, 0x58, 0x5A, 0x5B, 0x5D, - 0x5D, 0x5D, 0x5C, 0x5A, 0x54, 0x52, 0x4C, 0xFC, - 0xF7, 0x4E, 0x2D, 0x29, 0x4E, 0xFC, 0xFC, 0xFC, - 0xFB, 0x5F, 0x26, 0x24, 0x20, 0x2E, 0x65, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0x45, 0x3F, 0x45, - 0x3E, 0x47, 0x47, 0x47, 0x47, 0x47, 0x3E, 0x44, - 0x43, 0x40, 0x44, 0x49, 0x51, 0x5C, 0x62, 0x64, - 0xCB, 0xCB, 0x63, 0x60, 0x58, 0x50, 0x49, 0x48, - 0x48, 0x48, 0x4A, 0x4D, 0x53, 0x54, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x55, 0x54, 0x54, 0x54, - 0x54, 0x54, 0x55, 0x57, 0x59, 0x5B, 0x5C, 0x5D, - 0x5C, 0x5A, 0x54, 0x51, 0x4C, 0x4C, 0x54, 0xFC, - 0xF9, 0x23, 0xDB, 0x2D, 0x23, 0xFA, 0xFB, 0xFA, - 0xF5, 0x27, 0x21, 0xD9, 0xF8, 0x20, 0x21, 0xFB, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0x5D, 0x58, 0x55, - 0x50, 0x48, 0x45, 0x43, 0x44, 0x44, 0x45, 0x45, - 0x3E, 0x3F, 0x43, 0x41, 0x3F, 0x48, 0x52, 0x5D, - 0x63, 0x65, 0xCB, 0x65, 0x61, 0x5D, 0x52, 0x4B, - 0x48, 0x47, 0x47, 0x49, 0x4C, 0x51, 0x54, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x55, 0x54, 0x54, 0x54, - 0x54, 0x58, 0x5A, 0x59, 0x5B, 0x5B, 0x5B, 0x5A, - 0x55, 0x52, 0x4D, 0x4D, 0x55, 0x5B, 0x5D, 0xFC, - 0xF1, 0xF9, 0xFC, 0xD4, 0x21, 0xCC, 0xF7, 0xF8, - 0xF2, 0x21, 0xD9, 0xFC, 0xF2, 0xFB, 0x21, 0x45, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFB, 0xD1, 0xD0, 0xCD, - 0xCC, 0x63, 0x5E, 0x58, 0x50, 0x47, 0x43, 0x3F, - 0x3F, 0x3F, 0x3F, 0x3F, 0x40, 0x41, 0x3F, 0x4A, - 0x56, 0x5E, 0x64, 0xCB, 0x65, 0x63, 0x5E, 0x56, - 0x4C, 0x48, 0x47, 0x47, 0x49, 0x4C, 0x51, 0x54, - 0x58, 0x57, 0x57, 0x57, 0x57, 0x55, 0x54, 0x54, - 0x57, 0x5A, 0x5A, 0x5C, 0x5B, 0x5A, 0x58, 0x54, - 0x51, 0x4C, 0x55, 0x5D, 0x5D, 0x5B, 0x54, 0xFC, - 0xF0, 0xF9, 0xFC, 0x65, 0x45, 0xCD, 0xFB, 0xFB, - 0xF8, 0x26, 0xFB, 0xFC, 0xFC, 0xFC, 0x21, 0x27, - 0xFB, 0xFC, 0xFC, 0xFC, 0xFB, 0xD7, 0x35, 0x34, - 0x2F, 0x35, 0x36, 0x2F, 0x2F, 0x36, 0x2F, 0x2F, - 0x36, 0x36, 0x35, 0x35, 0x43, 0x42, 0x41, 0x2E, - 0x45, 0x4C, 0x5B, 0x62, 0x65, 0xCC, 0x64, 0x60, - 0x58, 0x4D, 0x49, 0x47, 0x47, 0x49, 0x4C, 0x51, - 0x58, 0x57, 0x57, 0x57, 0x57, 0x57, 0x55, 0x57, - 0x58, 0x5A, 0x5A, 0x5B, 0x5A, 0x55, 0x54, 0x51, - 0x53, 0x5C, 0x5D, 0x5D, 0x54, 0x4B, 0x4D, 0xFC, - 0xFC, 0x44, 0xFC, 0xFB, 0x7B, 0xAB, 0xA8, 0xAE, - 0xAB, 0x7F, 0xFC, 0xFC, 0xFB, 0xFB, 0x22, 0x2A, - 0xFC, 0xFC, 0xFC, 0xFC, 0x36, 0x2F, 0x30, 0x30, - 0x32, 0x30, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x2F, 0x2F, 0x40, 0x41, - 0x2E, 0x40, 0x48, 0x56, 0x5F, 0x64, 0xCC, 0x65, - 0x61, 0x59, 0x50, 0x49, 0x47, 0x47, 0x49, 0x4C, - 0x5A, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x58, - 0x5A, 0x5A, 0x5A, 0x58, 0x55, 0x52, 0x51, 0x5A, - 0x5D, 0x5D, 0x57, 0x4C, 0x51, 0x54, 0x5D, 0xFC, - 0xFC, 0x2A, 0xFC, 0xC9, 0xAA, 0x8B, 0x8A, 0x8C, - 0xAB, 0x8C, 0x8C, 0xFB, 0xFB, 0x23, 0x20, 0xF1, - 0xFC, 0xFC, 0xFC, 0x3B, 0x33, 0x33, 0x32, 0x32, - 0x31, 0x32, 0x30, 0x32, 0x32, 0x32, 0x32, 0x30, - 0x31, 0x31, 0x31, 0x32, 0x33, 0x33, 0x3C, 0x41, - 0x41, 0x2E, 0x2D, 0x45, 0x4D, 0x5D, 0x63, 0xCC, - 0x65, 0x62, 0x5D, 0x51, 0x49, 0x47, 0x47, 0x4A, - 0x59, 0x57, 0x57, 0x57, 0x57, 0x58, 0x58, 0x58, - 0x5A, 0x5A, 0x58, 0x55, 0x53, 0x53, 0x5C, 0x5E, - 0x59, 0x51, 0x4E, 0x54, 0x59, 0x5E, 0x62, 0xFC, - 0xFC, 0xDB, 0xAA, 0xA1, 0x95, 0x9C, 0x8C, 0x88, - 0x82, 0x83, 0x83, 0x8C, 0x88, 0xAE, 0xB9, 0xFB, - 0xFC, 0xFC, 0xFC, 0x3C, 0x3B, 0x72, 0x38, 0x33, - 0x33, 0x33, 0x31, 0x33, 0x31, 0x31, 0x31, 0x31, - 0x33, 0x33, 0x38, 0x33, 0x72, 0x3B, 0x44, 0x2E, - 0x41, 0x2E, 0x2E, 0x2D, 0x43, 0x4B, 0x5B, 0x63, - 0xCB, 0xCC, 0x63, 0x5D, 0x51, 0x49, 0x47, 0x49, - 0x5C, 0x58, 0x57, 0x57, 0x57, 0x57, 0x58, 0x58, - 0x58, 0x58, 0x57, 0x53, 0x58, 0x5D, 0x5E, 0x55, - 0x51, 0x53, 0x58, 0x5E, 0x60, 0x63, 0x64, 0xFC, - 0xFC, 0xC0, 0xA6, 0x9D, 0x8B, 0x9C, 0x8C, 0x8C, - 0x6E, 0x83, 0x88, 0x8C, 0x8C, 0x8C, 0x83, 0xE8, - 0xFB, 0xFC, 0xFC, 0xFC, 0x33, 0x70, 0x70, 0x6F, - 0x6F, 0x6F, 0x6F, 0x3A, 0x6F, 0x6D, 0x6F, 0x6F, - 0x70, 0x6F, 0x6F, 0x70, 0x6F, 0x32, 0x5A, 0x48, - 0x41, 0x2D, 0x2D, 0x2D, 0x2C, 0x41, 0x49, 0x5A, - 0x62, 0xCB, 0xCB, 0x63, 0x5D, 0x50, 0x49, 0x4A, - 0x5C, 0x58, 0x58, 0x57, 0x55, 0x57, 0x57, 0x57, - 0x57, 0x55, 0x56, 0x59, 0x5E, 0x5C, 0x52, 0x53, - 0x55, 0x5B, 0x5E, 0x61, 0x63, 0x64, 0x63, 0xFC, - 0xE8, 0xBF, 0xA4, 0x99, 0x9C, 0x8C, 0x88, 0x88, - 0x6E, 0x88, 0x8C, 0x8C, 0x8C, 0xC2, 0xA6, 0xC4, - 0xFC, 0xFC, 0xFC, 0xFC, 0x36, 0x3A, 0x6F, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x37, 0x32, 0xCD, 0x5E, - 0x4C, 0x43, 0x2C, 0x2D, 0x2D, 0x2C, 0x2E, 0x47, - 0x57, 0x61, 0x65, 0xCC, 0x63, 0x5C, 0x50, 0x4D, - 0x5C, 0x5A, 0x57, 0x55, 0x55, 0x55, 0x58, 0x58, - 0x55, 0x54, 0x5B, 0x5E, 0x5D, 0x53, 0x53, 0x55, - 0x5D, 0x5E, 0x61, 0x61, 0x61, 0x61, 0x5E, 0xFC, - 0xEA, 0xBE, 0xA4, 0x9B, 0x8B, 0x85, 0x8C, 0x6E, - 0x8C, 0x8C, 0x8C, 0xA3, 0xAA, 0xA4, 0xA4, 0xE9, - 0xFB, 0xFC, 0xFC, 0xFC, 0x36, 0x6D, 0x70, 0x73, - 0x70, 0x70, 0x70, 0x73, 0x73, 0x73, 0x73, 0x70, - 0x70, 0x70, 0x73, 0x70, 0x37, 0x38, 0xD1, 0xCF, - 0x61, 0x4D, 0x44, 0x2C, 0x2D, 0x2E, 0x2C, 0x2E, - 0x3E, 0x56, 0x61, 0xCB, 0xCC, 0x62, 0x5B, 0x57, - 0x59, 0x58, 0x55, 0x54, 0x54, 0x55, 0x58, 0x58, - 0x58, 0x5B, 0x5E, 0x5B, 0x53, 0x55, 0x55, 0x5C, - 0x5E, 0x61, 0x61, 0x60, 0x5D, 0x5A, 0x4E, 0xFC, - 0xFC, 0xEA, 0xAA, 0x9C, 0x8A, 0x85, 0x82, 0x8C, - 0x8C, 0xA8, 0xEB, 0xA8, 0xA4, 0xA4, 0xAA, 0xFC, - 0xFC, 0xFC, 0x64, 0xFB, 0x39, 0x31, 0x72, 0x78, - 0x73, 0x78, 0x73, 0x74, 0x74, 0x74, 0x74, 0x73, - 0x78, 0x70, 0x73, 0x73, 0x33, 0xCC, 0xD2, 0xD1, - 0xCE, 0x62, 0x53, 0x3F, 0x2D, 0x2D, 0x41, 0x2C, - 0x2E, 0x3E, 0x56, 0x62, 0xCB, 0xCB, 0x61, 0x5D, - 0x54, 0x54, 0x54, 0x54, 0x56, 0x58, 0x58, 0x58, - 0x5C, 0x5E, 0x5A, 0x55, 0x58, 0x58, 0x5B, 0x5E, - 0x61, 0x5E, 0x5D, 0x5A, 0x52, 0x55, 0xCD, 0xFC, - 0xFC, 0x34, 0xC9, 0xE8, 0xA8, 0xAE, 0xC2, 0xE8, - 0xC3, 0xA6, 0xA7, 0xA6, 0xAA, 0x78, 0x2E, 0x42, - 0xFC, 0xFC, 0xD2, 0x64, 0xF8, 0x31, 0x72, 0x73, - 0x73, 0x73, 0x73, 0x74, 0x75, 0x75, 0x74, 0x73, - 0x73, 0x73, 0x73, 0x72, 0x33, 0x5C, 0x64, 0xD2, - 0xD1, 0xCF, 0x63, 0x54, 0x3F, 0x2C, 0x41, 0x41, - 0x2C, 0x2E, 0x47, 0x58, 0x63, 0xCB, 0xCB, 0x62, - 0x52, 0x53, 0x53, 0x56, 0x58, 0x58, 0x5A, 0x5B, - 0x5E, 0x5A, 0x57, 0x58, 0x58, 0x58, 0x60, 0x60, - 0x5D, 0x5A, 0x55, 0x4E, 0x64, 0xD2, 0xD1, 0xFC, - 0xFC, 0x41, 0x3E, 0xC1, 0xC0, 0xA3, 0xA6, 0xA7, - 0xA7, 0xA9, 0xAA, 0xB8, 0x2E, 0x3F, 0x2C, 0x41, - 0xFC, 0xFC, 0xF7, 0xCE, 0xCD, 0x36, 0x72, 0x73, - 0x74, 0x75, 0x78, 0x75, 0x75, 0x75, 0x74, 0x74, - 0x74, 0x74, 0x78, 0x72, 0x6D, 0x49, 0x59, 0xCB, - 0xD1, 0xD1, 0xD2, 0xCB, 0x56, 0x3F, 0x2C, 0x41, - 0x40, 0x2D, 0x2E, 0x49, 0x5B, 0x64, 0xCC, 0x64, - 0x51, 0x53, 0x53, 0x55, 0x58, 0x59, 0x5B, 0x5E, - 0x59, 0x58, 0x58, 0x58, 0x55, 0x60, 0x60, 0x5C, - 0x5A, 0x53, 0x5B, 0xD0, 0xD3, 0xD3, 0xD3, 0xFB, - 0xFC, 0x40, 0x41, 0x45, 0xC4, 0xC0, 0xBE, 0xBE, - 0xC1, 0xC0, 0x3C, 0x47, 0x2E, 0x21, 0x22, 0x20, - 0x65, 0xFC, 0xFC, 0xFC, 0xFC, 0x6D, 0x72, 0x75, - 0x78, 0x76, 0x75, 0x79, 0x76, 0x76, 0x76, 0x76, - 0x75, 0x75, 0x75, 0x72, 0x6D, 0x2E, 0x48, 0x5D, - 0xCE, 0xD1, 0xD4, 0xD3, 0xCB, 0x56, 0x43, 0x2C, - 0x42, 0x43, 0x2E, 0x2E, 0x4A, 0x5D, 0x64, 0x64, - 0x50, 0x52, 0x56, 0x58, 0x5C, 0x5D, 0x5E, 0x5D, - 0x5A, 0x58, 0x58, 0x55, 0x61, 0x60, 0x58, 0x58, - 0x4E, 0x61, 0xD1, 0xD4, 0xD4, 0xD1, 0xEE, 0xFC, - 0xFC, 0x2B, 0x29, 0x2E, 0x3F, 0xB0, 0xAD, 0x81, - 0x46, 0x2D, 0x46, 0x2C, 0x24, 0x22, 0x22, 0x23, - 0x25, 0xFC, 0xFC, 0xFC, 0xFC, 0x6E, 0x73, 0x76, - 0x76, 0x79, 0x79, 0x79, 0x76, 0x76, 0x79, 0x76, - 0x79, 0x79, 0x79, 0x74, 0x3F, 0x41, 0x2C, 0x48, - 0x5F, 0xCF, 0xD5, 0xD7, 0xD6, 0xCD, 0x57, 0x40, - 0x2E, 0x3F, 0x44, 0x2E, 0x41, 0x4C, 0x60, 0x61, - 0x51, 0x53, 0x58, 0x5C, 0x5D, 0x5E, 0x5D, 0x5C, - 0x58, 0x57, 0x54, 0x5F, 0x5E, 0x55, 0x55, 0x52, - 0x64, 0xD4, 0xD5, 0xD4, 0xD1, 0x5D, 0xFA, 0xFB, - 0xF4, 0x21, 0x24, 0x41, 0x40, 0x44, 0x2E, 0x2E, - 0x42, 0x41, 0x2A, 0x24, 0x22, 0x22, 0x22, 0x22, - 0x23, 0xD9, 0xFC, 0xFC, 0xFC, 0xFC, 0xE5, 0xB8, - 0x8F, 0x8F, 0x7A, 0x8F, 0x7A, 0x8F, 0x7A, 0x8F, - 0x8F, 0x8F, 0xB8, 0xE5, 0x3F, 0x3E, 0x43, 0x2C, - 0x48, 0x61, 0xD1, 0xD7, 0xD9, 0xD7, 0xD0, 0x57, - 0x41, 0x2E, 0x3E, 0x44, 0x2D, 0x40, 0x52, 0x5D, - 0x53, 0x55, 0x59, 0x5D, 0x5E, 0x5E, 0x5D, 0x5A, - 0x57, 0x53, 0x5E, 0x5E, 0x54, 0x53, 0x54, 0x65, - 0xD5, 0xD6, 0xD4, 0xCE, 0x53, 0xFB, 0xF9, 0xFC, - 0x24, 0x22, 0x23, 0x23, 0x41, 0x42, 0x2E, 0x40, - 0x2B, 0x21, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x23, 0x23, 0xFC, 0xFC, 0xFC, 0xFC, 0xE7, 0xBD, - 0xB5, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, - 0x93, 0xB5, 0xC6, 0xEB, 0x2D, 0x47, 0x4A, 0x47, - 0x2C, 0x3E, 0x61, 0xD4, 0xDC, 0xDC, 0xDA, 0xCF, - 0x54, 0x41, 0x41, 0x3E, 0x45, 0x2C, 0x3F, 0x4A, - 0x58, 0x5A, 0x5C, 0x5F, 0x60, 0x5E, 0x5D, 0x57, - 0x51, 0x5D, 0x5D, 0x51, 0x53, 0x53, 0xCB, 0xD5, - 0xD6, 0xD5, 0x63, 0x55, 0xFC, 0xFC, 0xFC, 0x2C, - 0x23, 0x22, 0x23, 0x22, 0x20, 0x2D, 0x2C, 0x26, - 0x21, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x21, 0xF0, 0xFC, 0xFC, 0xFC, 0xE2, 0xC6, - 0xB5, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, - 0x93, 0x93, 0xC7, 0xE3, 0x3E, 0x2E, 0x49, 0x52, - 0x4C, 0x41, 0x44, 0x62, 0xD6, 0xDE, 0xDE, 0xD9, - 0xD0, 0x51, 0x2E, 0x40, 0x47, 0x44, 0x2C, 0x42, - 0x5D, 0x5D, 0x5F, 0x60, 0x60, 0x5D, 0x57, 0x51, - 0x58, 0x5D, 0x4E, 0x52, 0x55, 0x64, 0xD5, 0xD6, - 0xD4, 0x61, 0x59, 0x6B, 0xFC, 0xFC, 0xFC, 0x21, - 0x23, 0x22, 0x23, 0x22, 0x23, 0x21, 0x23, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x21, 0x24, 0xFC, 0xFC, 0xFC, 0xE2, 0xC7, - 0xB5, 0x90, 0x93, 0x93, 0x93, 0x90, 0x93, 0x93, - 0x90, 0xB5, 0xC8, 0xE4, 0x5F, 0x45, 0x2E, 0x4D, - 0x57, 0x57, 0x44, 0x43, 0x63, 0xDA, 0xDF, 0xDF, - 0xD9, 0xCE, 0x4C, 0x2C, 0x3F, 0x3E, 0x40, 0x40, - 0x60, 0x5E, 0x61, 0x61, 0x5E, 0x5B, 0x53, 0x52, - 0x5C, 0x52, 0x52, 0x55, 0x61, 0xD4, 0xD5, 0xD1, - 0x5E, 0x5B, 0x5C, 0xFB, 0xFC, 0xFC, 0x2A, 0x21, - 0x23, 0x22, 0x23, 0x22, 0x22, 0x22, 0x23, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0xFB, 0xFC, 0xFC, 0xB3, 0xC8, - 0xB5, 0x90, 0x92, 0xB5, 0x93, 0x93, 0xB5, 0x93, - 0x92, 0xB5, 0xC8, 0xB9, 0xD0, 0x5E, 0x44, 0x40, - 0x52, 0x58, 0x57, 0x48, 0x40, 0x63, 0xD9, 0xE0, - 0xE0, 0xD9, 0xCB, 0x49, 0x2D, 0x3F, 0x45, 0x3F, - 0x63, 0x61, 0x62, 0x60, 0x5E, 0x55, 0x4D, 0x59, - 0x53, 0x4E, 0x54, 0x5D, 0xD2, 0xD4, 0xD2, 0x5E, - 0x5C, 0x5D, 0xFC, 0xFC, 0xFC, 0xF8, 0x29, 0x23, - 0x23, 0x23, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x23, 0x22, 0x22, 0x23, 0x23, 0x23, 0x22, 0x22, - 0x22, 0x22, 0x22, 0xF0, 0xFC, 0xFC, 0xB3, 0xC7, - 0xB5, 0x93, 0xB5, 0x93, 0x93, 0x91, 0x93, 0x93, - 0x91, 0xB5, 0xC7, 0xAD, 0xD6, 0xD2, 0x5E, 0x3F, - 0x3F, 0x57, 0x57, 0x58, 0x4A, 0x41, 0x64, 0xDC, - 0xF1, 0xDF, 0xDA, 0x61, 0x45, 0x2E, 0x43, 0x47, - 0xCB, 0x63, 0x62, 0x5F, 0x58, 0x51, 0x53, 0x54, - 0x4C, 0x52, 0x5C, 0xCD, 0xD3, 0xD2, 0x60, 0x5D, - 0x5D, 0xFB, 0xFC, 0xFC, 0xFC, 0xDB, 0x49, 0x24, - 0x21, 0x23, 0x23, 0x22, 0x26, 0x26, 0x2A, 0x24, - 0x22, 0x23, 0x22, 0x21, 0x24, 0x26, 0x26, 0x2A, - 0x29, 0x2B, 0x24, 0x25, 0xFC, 0xFC, 0xB3, 0xC5, - 0x91, 0x91, 0x92, 0x91, 0x92, 0x92, 0x93, 0x93, - 0x91, 0x93, 0xC6, 0xAD, 0xDC, 0xD9, 0xD4, 0x60, - 0x43, 0x45, 0x58, 0x58, 0x57, 0x4B, 0x43, 0xCC, - 0xDD, 0xF1, 0xD8, 0xD5, 0x5D, 0x43, 0x41, 0x47, - 0xCD, 0x63, 0x62, 0x5D, 0x54, 0x4C, 0x55, 0x4B, - 0x51, 0x58, 0x62, 0xD0, 0xD0, 0x62, 0x5D, 0x5D, - 0x67, 0xFC, 0xFC, 0xFC, 0xFC, 0x58, 0x4E, 0x28, - 0x2A, 0x20, 0x23, 0x22, 0x23, 0x2A, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x23, 0x25, 0x2A, 0x2E, 0x2D, - 0x2E, 0x2E, 0x2E, 0x23, 0xFA, 0xFC, 0xB2, 0xBD, - 0xB5, 0x90, 0x91, 0x93, 0x92, 0x90, 0x91, 0x93, - 0x92, 0x91, 0xBD, 0xAD, 0xDE, 0xE0, 0xD8, 0xD7, - 0x61, 0x40, 0x48, 0x58, 0x58, 0x58, 0x48, 0x44, - 0xCF, 0xDE, 0xE0, 0xDD, 0xD0, 0x52, 0x41, 0x45, - 0xCD, 0x63, 0x61, 0x58, 0x4D, 0x51, 0x4C, 0x4B, - 0x54, 0x5D, 0xCC, 0xCE, 0x63, 0x61, 0x5D, 0x5D, - 0xFB, 0xFC, 0xFC, 0xFC, 0xFC, 0x4B, 0x27, 0x21, - 0x22, 0x22, 0x23, 0x22, 0x22, 0x24, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x20, - 0x27, 0x2B, 0x41, 0x2B, 0x23, 0xFC, 0xB2, 0xB6, - 0x93, 0x90, 0x92, 0xB5, 0x92, 0x90, 0xB5, 0x90, - 0x92, 0x93, 0xBC, 0xAD, 0xDC, 0xF1, 0xF3, 0xF0, - 0xD9, 0x61, 0x41, 0x4A, 0x58, 0x57, 0x57, 0x44, - 0x49, 0xD2, 0xDD, 0xD8, 0xDA, 0x63, 0x4A, 0x45, - 0xCC, 0x63, 0x5E, 0x52, 0x4B, 0x4C, 0x49, 0x51, - 0x5C, 0x61, 0xCD, 0x65, 0x63, 0x5E, 0x4E, 0xCF, - 0xFB, 0xFB, 0xF0, 0xFC, 0xD2, 0x2A, 0x22, 0x23, - 0x22, 0x22, 0x23, 0x22, 0x22, 0x21, 0x22, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x23, 0x22, 0x26, 0x41, 0x27, 0xF9, 0x81, 0xB7, - 0xB5, 0x91, 0x92, 0xB5, 0x91, 0xB5, 0x93, 0xB5, - 0x93, 0xB6, 0xB7, 0xB9, 0xCB, 0xD8, 0xF3, 0xF2, - 0xF2, 0xDB, 0x61, 0x2D, 0x51, 0x58, 0x57, 0x58, - 0x41, 0x51, 0xD4, 0xDB, 0xDC, 0xD1, 0x5B, 0x4C, - 0xCB, 0x62, 0x59, 0x4C, 0x4A, 0x49, 0x4B, 0x55, - 0x60, 0x64, 0xCC, 0x64, 0x5E, 0x55, 0x60, 0xE1, - 0xFB, 0xF8, 0xFC, 0xFC, 0x21, 0x22, 0x22, 0x23, - 0x22, 0x22, 0x23, 0x22, 0x22, 0x21, 0x22, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x23, 0x22, 0x21, 0x24, 0x2D, 0x21, 0xB4, 0xBB, - 0xB6, 0xB5, 0xB6, 0xB7, 0xB7, 0xB7, 0xB7, 0xB6, - 0xB6, 0xB6, 0xBB, 0xB9, 0x45, 0xCB, 0xDF, 0xF3, - 0xF3, 0xF3, 0xDB, 0x5E, 0x2C, 0x51, 0x58, 0x58, - 0x52, 0x2D, 0x5C, 0xD4, 0xD9, 0xD5, 0x63, 0x58, - 0x64, 0x60, 0x53, 0x49, 0x4A, 0x49, 0x52, 0x5C, - 0x63, 0xCD, 0xCD, 0x63, 0x5C, 0x4E, 0x65, 0xFC, - 0xFC, 0xF5, 0xFC, 0xD2, 0x23, 0x22, 0x22, 0x23, - 0x22, 0x22, 0x23, 0x22, 0x22, 0x21, 0x22, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x23, 0x22, 0x21, 0x22, 0x25, 0x29, 0xB3, 0xC7, - 0xB5, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, - 0xB6, 0xB5, 0xC7, 0xAD, 0x57, 0x3F, 0xCB, 0xF0, - 0xF3, 0xF3, 0xF2, 0xD9, 0x58, 0x41, 0x4C, 0x58, - 0x57, 0x47, 0x42, 0x62, 0xD4, 0xD4, 0xCC, 0x60, - 0x63, 0x5D, 0x50, 0x47, 0x48, 0x4B, 0x58, 0x60, - 0xCC, 0xCE, 0xCD, 0x60, 0x53, 0x5C, 0x62, 0xFB, - 0xF9, 0xFC, 0xFC, 0x21, 0x23, 0x22, 0x22, 0x23, - 0x22, 0x22, 0x23, 0x23, 0x23, 0x21, 0x22, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, 0x81, 0xC7, - 0xB7, 0xB7, 0xBC, 0xB7, 0xBC, 0xBC, 0xBC, 0xB7, - 0xB7, 0xB7, 0xC8, 0x80, 0x58, 0x57, 0x40, 0xCE, - 0xF3, 0xF2, 0xF2, 0xF0, 0xD5, 0x4C, 0x3F, 0x4B, - 0x52, 0x50, 0x2D, 0x4B, 0x64, 0xD2, 0xCC, 0x61, - 0x60, 0x58, 0x4A, 0x47, 0x47, 0x4C, 0x59, 0x64, - 0xD0, 0xD0, 0x64, 0x59, 0x49, 0x5D, 0xFB, 0xFC, - 0xD9, 0xFC, 0xD6, 0x23, 0x22, 0x22, 0x22, 0x23, - 0x22, 0x22, 0x23, 0x23, 0x21, 0x21, 0x22, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, 0xB4, 0xC8, - 0xBD, 0xB7, 0xBD, 0xBC, 0xBD, 0xC5, 0xBC, 0xC5, - 0xBC, 0xBD, 0xC7, 0xAC, 0x58, 0x57, 0x58, 0x2C, - 0xD1, 0xF0, 0xF3, 0xF3, 0xE0, 0xCD, 0x45, 0x3E, - 0x48, 0x4B, 0x3F, 0x41, 0x56, 0x64, 0x65, 0x62, - 0x5D, 0x52, 0x47, 0x48, 0x48, 0x53, 0x60, 0xCC, - 0xD2, 0xD0, 0x63, 0x52, 0x4E, 0x53, 0xFB, 0xFB, - 0xFC, 0xFC, 0x23, 0x23, 0x22, 0x23, 0x22, 0x23, - 0x22, 0x22, 0x23, 0x23, 0x20, 0x21, 0x22, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x23, 0x22, 0x23, 0x22, 0x23, 0x22, 0xB4, 0xC7, - 0xC5, 0xBC, 0xC5, 0xBD, 0xC5, 0xC5, 0xBD, 0xC5, - 0xBC, 0xC6, 0xC7, 0xB9, 0x58, 0x57, 0x58, 0x57, - 0x2D, 0xD4, 0xF1, 0xF2, 0xF0, 0xD9, 0x5D, 0x47, - 0x48, 0x3F, 0x42, 0x2C, 0x48, 0x5C, 0x5F, 0x60, - 0x58, 0x50, 0x47, 0x4A, 0x49, 0x55, 0x63, 0xD0, - 0xD2, 0xCD, 0x5D, 0x49, 0x4E, 0xE1, 0xFC, 0xF0, - 0xFC, 0xF8, 0x22, 0x22, 0x22, 0x23, 0x22, 0x23, - 0x22, 0x22, 0x23, 0x20, 0x21, 0x21, 0x22, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x23, 0x22, - 0x23, 0x22, 0x23, 0x23, 0x23, 0x22, 0xC4, 0xC8, - 0xBD, 0xBD, 0xC6, 0xBD, 0xC6, 0xC6, 0xC5, 0xC6, - 0xBD, 0xC6, 0xC7, 0xE4, 0x54, 0x57, 0x58, 0x57, - 0x57, 0x43, 0xD7, 0xE0, 0xF1, 0xD8, 0xCD, 0x4B, - 0x4A, 0x47, 0x42, 0x2C, 0x3F, 0x4D, 0x58, 0x5C, - 0x52, 0x4B, 0x48, 0x4B, 0x4A, 0x58, 0xCB, 0xD3, - 0xD2, 0xCD, 0x58, 0x47, 0x4A, 0xFC, 0xFC, 0xFB, - 0xFC, 0x2B, 0x22, 0x22, 0x22, 0x23, 0x22, 0x23, - 0x22, 0x22, 0x23, 0x26, 0x21, 0x21, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, - 0x22, 0x23, 0x22, 0x23, 0x22, 0x23, 0xE5, 0xC8, - 0xBA, 0xC5, 0xC6, 0xC6, 0xC6, 0xC7, 0xC6, 0xC7, - 0xC5, 0xC6, 0xC8, 0xE5, 0x2E, 0x54, 0x58, 0x57, - 0x57, 0x4C, 0x4D, 0xDA, 0xD8, 0xD8, 0xD4, 0x5C, - 0x4B, 0x4B, 0x3F, 0x42, 0x44, 0x4A, 0x51, 0x58, - 0x4B, 0x48, 0x4B, 0x51, 0x4D, 0x5F, 0xD0, 0xD1, - 0xD0, 0x64, 0x51, 0x44, 0x6B, 0xFC, 0xFB, 0xFC, - 0xFC, 0x21, 0x23, 0x22, 0x22, 0x23, 0x22, 0x23, - 0x22, 0x22, 0x23, 0x26, 0x21, 0x23, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, - 0x22, 0x23, 0x22, 0x23, 0x23, 0x23, 0xE5, 0xED, - 0xE7, 0xBA, 0xC8, 0xC6, 0xC6, 0xC6, 0xC6, 0xC7, - 0xC7, 0xE5, 0xED, 0xE6, 0x61, 0x41, 0x52, 0x58, - 0x58, 0x57, 0x45, 0x5E, 0xD7, 0xDD, 0xD5, 0x60, - 0x4B, 0x4C, 0x48, 0x4D, 0x4D, 0x50, 0x4D, 0x56, - 0x4A, 0x3E, 0x53, 0x53, 0x52, 0x63, 0xD3, 0xD0, - 0xCE, 0x60, 0x4A, 0x45, 0xFC, 0xFC, 0xF7, 0xFC, - 0xFC, 0x21, 0x23, 0x23, 0x22, 0x23, 0x22, 0x23, - 0x22, 0x23, 0x21, 0x2A, 0x20, 0x23, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x23, 0x22, 0x23, 0x22, 0x21, 0x23, 0xEB, 0xF6, - 0xF6, 0xED, 0xED, 0xED, 0xED, 0xED, 0xED, 0xED, - 0xF6, 0xF6, 0xF6, 0xE6, 0xDB, 0x58, 0x45, 0x4B, - 0x58, 0x57, 0x4D, 0x4B, 0x64, 0xD4, 0xD0, 0x5C, - 0x48, 0x51, 0x4C, 0x5D, 0x5E, 0x5C, 0x56, 0x59, - 0x3E, 0x4A, 0x58, 0x54, 0x52, 0x65, 0xD3, 0xD0, - 0xCF, 0x5D, 0x48, 0xFC, 0xFC, 0xFC, 0xFA, 0xFC, - 0xFC, 0x21, 0x22, 0x23, 0x22, 0x23, 0x22, 0x23, - 0x22, 0x23, 0x21, 0x2A, 0x21, 0x23, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x23, 0x22, 0x23, 0x22, 0x21, 0x4F, 0xE6, 0xC6, - 0xC6, 0xBD, 0xC6, 0xBD, 0xBD, 0xBD, 0xBD, 0xC6, - 0xC5, 0xBA, 0xC7, 0xE6, 0xF2, 0xD4, 0x49, 0x4B, - 0x3E, 0x4D, 0x52, 0x3E, 0x52, 0x63, 0x64, 0x56, - 0x48, 0x54, 0x4D, 0x61, 0xCC, 0xCC, 0x60, 0x60, - 0x47, 0x4D, 0x5C, 0x53, 0x58, 0xCF, 0xD1, 0xCF, - 0xD0, 0x59, 0x45, 0xFC, 0xFC, 0xFC, 0xEF, 0xF9, - 0xFC, 0x21, 0x23, 0x22, 0x23, 0x22, 0x23, 0x22, - 0x23, 0x22, 0x23, 0x2A, 0x21, 0x23, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x23, 0x22, 0x23, 0x22, 0x23, 0x4F, 0xE4, 0xB9, - 0xAF, 0x80, 0x80, 0x8E, 0x8E, 0x8E, 0x8E, 0x8F, - 0x80, 0xB4, 0xB9, 0xE4, 0x7F, 0xDE, 0x61, 0x52, - 0x54, 0x48, 0x3F, 0x43, 0x4D, 0x56, 0x59, 0x4B, - 0x3E, 0x58, 0x53, 0x61, 0xD3, 0xD4, 0xCF, 0xCD, - 0x4C, 0x58, 0x5F, 0x53, 0x5E, 0xD3, 0xD0, 0xCE, - 0xCE, 0x52, 0x3F, 0xFC, 0xFC, 0xFC, 0xF7, 0x65, - 0xFA, 0x22, 0x23, 0x22, 0x23, 0x22, 0x23, 0x22, - 0x23, 0x22, 0x21, 0x2A, 0x23, 0x23, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x23, 0x22, 0x23, 0x22, 0x21, 0xB1, 0xE4, 0xE6, - 0x7C, 0xB1, 0x7C, 0xB1, 0xB2, 0xB2, 0xB3, 0x3D, - 0xB3, 0x3C, 0xE5, 0xB3, 0xB0, 0xF1, 0xD0, 0x58, - 0x5D, 0x4D, 0x40, 0x41, 0x48, 0x51, 0x4C, 0x3F, - 0x3F, 0x4D, 0x5A, 0x5A, 0xD5, 0xD9, 0xD7, 0xD4, - 0x57, 0x5E, 0x61, 0x4C, 0x63, 0xD4, 0xCF, 0xCE, - 0xCB, 0x4D, 0x4A, 0xFC, 0xFC, 0xFC, 0xFC, 0xF0, - 0xFB, 0x22, 0x23, 0x22, 0x23, 0x22, 0x23, 0x22, - 0x23, 0x22, 0x23, 0x2A, 0x21, 0x23, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x22, 0x23, 0x22, 0x23, 0x23, 0xB1, 0x81, 0x7D, - 0x39, 0x35, 0x35, 0x36, 0x36, 0x36, 0x36, 0x36, - 0x36, 0x36, 0x7C, 0xB2, 0xB0, 0xDF, 0xD2, 0x57, - 0x60, 0x59, 0x5B, 0x59, 0x52, 0x4C, 0x4A, 0x40, - 0x42, 0x4A, 0x53, 0x4D, 0xD2, 0xDE, 0xDE, 0xD9, - 0x5E, 0x5E, 0x60, 0x4A, 0xCD, 0xD1, 0xCF, 0xCE, - 0x63, 0x49, 0x5C, 0xFB, 0xE8, 0x89, 0x9F, 0xFC, - 0xD6, 0x21, 0x21, 0x23, 0x22, 0x22, 0x23, 0x22, - 0x23, 0x22, 0x21, 0x2A, 0x22, 0x23, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x7F, 0xB9, - 0x71, 0x6C, 0x38, 0x38, 0x33, 0x33, 0x33, 0x38, - 0x38, 0x71, 0xAD, 0xE4, 0xD3, 0xDA, 0xCC, 0x52, - 0x63, 0x60, 0xCE, 0xD4, 0xCF, 0x60, 0x4C, 0x40, - 0x3F, 0x45, 0x4B, 0x5A, 0xCB, 0xD8, 0xDE, 0xDC, - 0x5E, 0x5E, 0x5F, 0x4C, 0xD2, 0xD2, 0xCF, 0xCF, - 0x61, 0x45, 0x5E, 0xA7, 0x9D, 0x95, 0x8B, 0x99, - 0xFC, 0x41, 0x21, 0x23, 0x23, 0x22, 0x23, 0x22, - 0x23, 0x22, 0x23, 0x2A, 0x23, 0x23, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x77, 0x77, 0xF6, - 0xFC, 0x7D, 0x7D, 0x7E, 0x7E, 0x7E, 0x7E, 0x7D, - 0x7D, 0xFC, 0x47, 0x64, 0xD0, 0xD0, 0x5D, 0x4B, - 0x62, 0xCC, 0xD1, 0xDE, 0xDE, 0xD4, 0x5E, 0x43, - 0x3F, 0x3E, 0x48, 0x53, 0x58, 0xDB, 0xD8, 0xDC, - 0x5E, 0x5E, 0x5E, 0x53, 0xD4, 0xD2, 0xD0, 0xD0, - 0x5E, 0x49, 0xA7, 0xA6, 0x89, 0x95, 0x8B, 0x9C, - 0x9C, 0xFB, 0xD4, 0x22, 0x22, 0x22, 0x22, 0x23, - 0x22, 0x23, 0x23, 0x2A, 0x22, 0x23, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, - 0x23, 0x22, 0x23, 0x23, 0x98, 0x8C, 0x8C, 0x88, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xF8, - 0xE9, 0x9C, 0x48, 0x5C, 0xD0, 0xCB, 0x48, 0x49, - 0x5B, 0xCB, 0xCD, 0xE0, 0xF1, 0xDD, 0xD0, 0x4A, - 0x41, 0x47, 0x45, 0x4C, 0x48, 0xD7, 0xDE, 0xDC, - 0x5E, 0x5E, 0x5A, 0x58, 0xD1, 0xD0, 0xD0, 0xD2, - 0x5C, 0x55, 0xA7, 0xA6, 0x87, 0x86, 0x89, 0x94, - 0x9C, 0xA9, 0xFC, 0xF4, 0x22, 0x23, 0x22, 0x23, - 0x22, 0x23, 0x22, 0x2A, 0x21, 0x23, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, - 0x22, 0x23, 0x22, 0x23, 0xA4, 0x89, 0x8C, 0xAA, - 0xFB, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xF7, - 0x85, 0x88, 0x8D, 0x59, 0x64, 0x63, 0x47, 0x3E, - 0x4C, 0x60, 0x61, 0xE0, 0xF0, 0xDF, 0xD9, 0x5D, - 0x2E, 0x3E, 0x3E, 0x47, 0x4D, 0xCD, 0xDE, 0xDC, - 0x5D, 0x5C, 0x51, 0x5D, 0xD1, 0xD2, 0xD2, 0xD4, - 0x5A, 0xBE, 0xA7, 0x98, 0x8A, 0x8A, 0xA0, 0x8B, - 0x86, 0x86, 0xF7, 0xFC, 0xF7, 0x26, 0x23, 0x23, - 0x22, 0x22, 0x22, 0x22, 0x21, 0x22, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, - 0x22, 0x21, 0x21, 0x21, 0xA1, 0x98, 0x9F, 0xBF, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xA7, - 0x8C, 0x86, 0x8D, 0x59, 0x5E, 0x5D, 0x3F, 0x3E, - 0x47, 0x53, 0x63, 0xD9, 0xF0, 0xF1, 0xDE, 0xD0, - 0x43, 0x3E, 0x47, 0x45, 0x4A, 0x5B, 0xDC, 0xDA, - 0x5D, 0x59, 0x49, 0x5F, 0xD1, 0xD2, 0xD3, 0xB9, - 0xA5, 0xA7, 0x98, 0x9B, 0x96, 0x9D, 0x89, 0x89, - 0x8B, 0x9C, 0x9D, 0xFC, 0xFC, 0xFC, 0x26, 0x22, - 0x23, 0x23, 0x22, 0x22, 0x21, 0x22, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, - 0x22, 0x22, 0x29, 0x2D, 0x99, 0x99, 0xA2, 0xAA, - 0xC4, 0xFB, 0xFC, 0xFC, 0xFC, 0xF6, 0xBF, 0xA2, - 0x9C, 0x9C, 0x8E, 0xDC, 0xCD, 0x51, 0x41, 0x3E, - 0x45, 0x49, 0x58, 0xCD, 0xE0, 0xE0, 0xD8, 0xDA, - 0x4C, 0x4A, 0x45, 0x45, 0x48, 0x47, 0xDA, 0xDA, - 0x5C, 0x58, 0x44, 0x69, 0xA9, 0x98, 0xA4, 0xA6, - 0xA1, 0xA4, 0x99, 0x9E, 0x9D, 0x8B, 0x8A, 0x97, - 0x87, 0x9A, 0x8A, 0xC2, 0xFC, 0xFC, 0xFC, 0x4D, - 0x21, 0x21, 0x23, 0x22, 0x21, 0x22, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x23, 0x22, - 0x21, 0x22, 0x2D, 0x34, 0xA4, 0xA2, 0xA2, 0xA9, - 0xBF, 0xC0, 0xC3, 0xC1, 0xC0, 0xBE, 0xA6, 0x9D, - 0x99, 0x87, 0xA2, 0xF1, 0xDC, 0x64, 0x42, 0x45, - 0x47, 0x3E, 0x49, 0x4C, 0xDD, 0xDF, 0xD8, 0xDB, - 0x5E, 0x4C, 0x48, 0x45, 0x45, 0x41, 0xD1, 0xD6, - 0x5A, 0x55, 0x3F, 0xA7, 0xA1, 0x98, 0x9F, 0x99, - 0x9F, 0x9D, 0x9A, 0x95, 0x8B, 0x97, 0x89, 0x8A, - 0x88, 0x94, 0x9C, 0x8C, 0xFC, 0xFC, 0xFC, 0xFC, - 0xF4, 0x21, 0x23, 0x22, 0x21, 0x22, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, - 0x23, 0x23, 0x2C, 0x2C, 0xA8, 0xA2, 0xA4, 0xA4, - 0xA9, 0xAA, 0xAA, 0xAA, 0xA9, 0xA6, 0x98, 0x9C, - 0x8B, 0x88, 0x98, 0x8D, 0xD8, 0xD6, 0x4E, 0x47, - 0x47, 0x49, 0x47, 0x3F, 0xDA, 0xDD, 0xDE, 0xDD, - 0xCC, 0x4A, 0x4B, 0x3E, 0x45, 0x43, 0x61, 0xD4, - 0x56, 0x51, 0x44, 0xA4, 0x9B, 0x8B, 0x9C, 0x9A, - 0xA0, 0xA2, 0x98, 0x98, 0x8B, 0x8B, 0x98, 0x98, - 0x84, 0x8B, 0x94, 0x8A, 0xA4, 0xFC, 0xFC, 0xFC, - 0xFC, 0xF2, 0x21, 0x22, 0x21, 0x22, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x23, 0x23, - 0x23, 0x22, 0x2C, 0x2D, 0xC0, 0xA4, 0xA2, 0xA4, - 0xA4, 0xA6, 0xA6, 0xA6, 0xA4, 0xA2, 0x9F, 0x89, - 0x8B, 0x9C, 0x9C, 0x8B, 0x68, 0xDB, 0x5F, 0x4B, - 0x3E, 0x49, 0x4B, 0x3E, 0xCC, 0xDA, 0xDC, 0xDD, - 0xD3, 0x49, 0x52, 0x48, 0x45, 0x45, 0x53, 0xD0, - 0x51, 0x4A, 0x44, 0xA4, 0x9B, 0x8B, 0x9C, 0xA0, - 0x9B, 0x86, 0x89, 0x98, 0x89, 0x8A, 0x96, 0x8A, - 0x9C, 0x89, 0x89, 0x9C, 0x8C, 0xF6, 0xFC, 0xFC, - 0xFC, 0xFC, 0x21, 0x22, 0x21, 0x22, 0x23, 0x22, - 0x22, 0x22, 0x22, 0x23, 0x22, 0x21, 0x22, 0x23, - 0x22, 0x21, 0x2B, 0x34, 0xC0, 0xA8, 0xA4, 0xA2, - 0xA2, 0x98, 0xA1, 0xA0, 0x98, 0x9F, 0x95, 0x8A, - 0x94, 0xA1, 0x8A, 0x84, 0x9B, 0x68, 0xCC, 0x49, - 0x4A, 0x47, 0x4C, 0x4B, 0x51, 0xD3, 0xDA, 0xDC, - 0xD5, 0x56, 0x56, 0x4A, 0x3E, 0x45, 0x48, 0x63, - 0x4A, 0x47, 0x3E, 0xA7, 0x98, 0x9D, 0x9E, 0x8B, - 0x95, 0x9B, 0x89, 0x86, 0x9B, 0x8B, 0x89, 0x84, - 0x9A, 0xA1, 0x95, 0x9A, 0x8C, 0xA4, 0xFC, 0xFC, - 0xFC, 0xFA, 0x23, 0x22, 0x21, 0x22, 0x23, 0x22, - 0x22, 0x22, 0x22, 0x23, 0x22, 0x21, 0x22, 0x23, - 0x21, 0x23, 0x2C, 0xF6, 0xBF, 0xA9, 0xA2, 0x99, - 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9B, 0x87, 0x8B, - 0x9C, 0x86, 0x9C, 0x8A, 0x87, 0x87, 0x89, 0x51, - 0x54, 0x47, 0x4B, 0x50, 0x4B, 0xCF, 0xD6, 0xDC, - 0xD5, 0x60, 0x54, 0x52, 0x48, 0x45, 0x40, 0x5A, - 0x45, 0x43, 0x47, 0xA7, 0x98, 0x9B, 0x95, 0x95, - 0x9A, 0x87, 0x98, 0x98, 0x8A, 0x86, 0x87, 0x9E, - 0x9B, 0x95, 0x9D, 0x9D, 0x99, 0x85, 0xA6, 0xFA, - 0xF2, 0x21, 0x23, 0x22, 0x21, 0x22, 0x23, 0x22, - 0x22, 0x22, 0x22, 0x23, 0x22, 0x21, 0x22, 0x22, - 0x21, 0x24, 0xFB, 0xF7, 0xBF, 0xA6, 0xA2, 0x99, - 0x97, 0x89, 0x86, 0x89, 0x9C, 0x96, 0x9E, 0x94, - 0x89, 0x99, 0x98, 0x89, 0x9E, 0x9B, 0x89, 0x8B, - 0x58, 0x4B, 0x4A, 0x52, 0x48, 0xCC, 0xD3, 0xDA, - 0xD3, 0x65, 0x4C, 0x58, 0x49, 0x3E, 0x2E, 0x4D, - 0x40, 0x41, 0x45, 0xA9, 0xA1, 0x9B, 0x9E, 0x9C, - 0x95, 0x8A, 0x94, 0x89, 0x96, 0x87, 0x9C, 0x9A, - 0x84, 0x9D, 0x9C, 0x9E, 0x9A, 0x9C, 0x9D, 0xBB, - 0x23, 0x23, 0x22, 0x22, 0x21, 0x22, 0x23, 0x22, - 0x22, 0x22, 0x22, 0x23, 0x22, 0x21, 0x23, 0x23, - 0x24, 0xFC, 0xFC, 0xF6, 0xBF, 0xA6, 0x9F, 0x99, - 0x89, 0x95, 0x87, 0x94, 0x9D, 0x9E, 0x97, 0x9E, - 0x95, 0x9B, 0x89, 0x95, 0x95, 0x9B, 0x89, 0x87, - 0x5D, 0x56, 0x3E, 0x51, 0x3E, 0x60, 0xCF, 0xD3, - 0xD2, 0xCD, 0x5C, 0x49, 0x4B, 0x3E, 0x2C, 0x48, - 0x3E, 0x43, 0x3E, 0xA9, 0xA1, 0x9B, 0x97, 0x94, - 0x95, 0x9A, 0x9C, 0x87, 0x87, 0x9B, 0x9C, 0x95, - 0x9D, 0x89, 0x9A, 0x89, 0x9E, 0x9E, 0x8C, 0xA6, - 0x20, 0x23, 0x23, 0x22, 0x23, 0x22, 0x23, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x21, 0x21, 0x20, 0x40, - 0xFC, 0xFC, 0xFC, 0xEC, 0xBE, 0xA4, 0x9F, 0x99, - 0x95, 0x9F, 0xA0, 0x88, 0x9D, 0x8B, 0x97, 0x95, - 0x87, 0x95, 0x96, 0x95, 0x97, 0x94, 0x94, 0x98, - 0xD3, 0x4C, 0x47, 0x4D, 0x42, 0x4C, 0x60, 0xCC, - 0xCE, 0xD0, 0x65, 0x4B, 0x47, 0x44, 0x2B, 0x45, - 0x4B, 0x47, 0x49, 0xA7, 0xA1, 0x9A, 0x97, 0x89, - 0x95, 0x97, 0x97, 0x9E, 0x89, 0x95, 0x89, 0x9C, - 0x87, 0x95, 0x97, 0x99, 0x95, 0x99, 0x9F, 0xA4, - 0xC4, 0x21, 0x21, 0x23, 0x21, 0x23, 0x23, 0x23, - 0x23, 0x23, 0x23, 0x23, 0x21, 0x20, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xEA, 0xAA, 0xA6, 0xA2, 0x99, - 0x8B, 0x9A, 0x95, 0x9E, 0x9E, 0x9A, 0x94, 0x87, - 0x94, 0x94, 0x89, 0x94, 0x9B, 0x9B, 0xA7, 0xDC, - 0xDB, 0x65, 0x2E, 0x3E, 0x43, 0x44, 0x49, 0x58, - 0x63, 0xD3, 0xD3, 0x5E, 0x42, 0x42, 0x2D, 0x40, - 0x54, 0x4C, 0x4A, 0xA7, 0xA0, 0x99, 0x9B, 0x94, - 0xA0, 0x8A, 0x9B, 0x9D, 0x87, 0x95, 0x94, 0x8B, - 0x8A, 0x98, 0x9C, 0x8A, 0x9B, 0x99, 0xA2, 0xA6, - 0xBF, 0xEC, 0x2A, 0x20, 0x21, 0x23, 0x21, 0x20, - 0x20, 0x20, 0x20, 0x4C, 0xF9, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xEB, 0xAA, 0xA4, 0x9F, 0x9C, - 0x8B, 0x9B, 0x88, 0x84, 0x9E, 0x9D, 0x96, 0x94, - 0x94, 0x9A, 0x9B, 0x9B, 0xA4, 0xD5, 0xCD, 0xDE, - 0xF1, 0xDA, 0x4C, 0x2D, 0x41, 0x2B, 0x42, 0x4C, - 0x5E, 0xD4, 0xD7, 0xCD, 0x49, 0x2E, 0x2E, 0x41, - 0x5E, 0x57, 0xA7, 0xA6, 0xA7, 0xA4, 0xA2, 0x98, - 0x9D, 0x9C, 0xA1, 0x99, 0x9D, 0x88, 0x8B, 0x9C, - 0x8A, 0x9C, 0x9C, 0x94, 0x9C, 0x89, 0xA0, 0xA6, - 0xAA, 0xEB, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFB, 0xE9, 0xAA, 0xA6, 0xA2, 0x8B, - 0x8B, 0x8A, 0x86, 0x9B, 0x9C, 0x98, 0xA0, 0x9B, - 0x9B, 0x84, 0xA7, 0xB4, 0x61, 0xD1, 0xD2, 0xE0, - 0xF1, 0xDC, 0x61, 0x2D, 0x2E, 0x3F, 0x56, 0x62, - 0x5D, 0xD4, 0xD9, 0xD3, 0x54, 0x41, 0x41, 0x44, - 0xCB, 0x60, 0x52, 0xA9, 0xA9, 0xA9, 0xA7, 0xA6, - 0xA6, 0xA4, 0xA4, 0xA2, 0xA2, 0x9D, 0x95, 0x89, - 0x9C, 0x8A, 0x9E, 0x9C, 0x8A, 0x9E, 0xA0, 0xA8, - 0xC0, 0xE9, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xE9, 0xAA, 0xA6, 0xA0, 0x99, - 0x9C, 0x8B, 0x9A, 0x84, 0x9B, 0x9B, 0x98, 0x98, - 0xA9, 0xB9, 0x49, 0x57, 0xCB, 0xD4, 0xD3, 0xF1, - 0xD8, 0xDA, 0xCE, 0x3F, 0x41, 0x4B, 0x5D, 0xCB, - 0x5E, 0xD6, 0xDB, 0xD6, 0x5D, 0x43, 0x3F, 0x49, - 0xD1, 0xCC, 0x4F, 0xDD, 0xC3, 0xBB, 0xBF, 0xAA, - 0xAA, 0xA9, 0xAA, 0xA8, 0xA8, 0xA6, 0xA6, 0xA2, - 0x9C, 0x9F, 0x9B, 0x9A, 0x9D, 0xA2, 0xA8, 0xAA, - 0xC1, 0xEA, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xEA, 0xC0, 0xAA, 0xA6, 0xA2, - 0xA2, 0x99, 0xA0, 0xA0, 0xA4, 0xA7, 0xA9, 0xC0, - 0x67, 0x49, 0x54, 0x60, 0xD0, 0xD4, 0xCC, 0xDF, - 0xD9, 0xD5, 0xD2, 0x3E, 0x47, 0x56, 0x60, 0xCD, - 0x5D, 0xD9, 0xD9, 0xD6, 0x61, 0x3F, 0x47, 0x52, - 0xD6, 0xD3, 0x62, 0x4D, 0x40, 0x4A, 0x57, 0xCA, - 0xC3, 0xC1, 0xC1, 0xC0, 0xBF, 0xBF, 0xAA, 0xAA, - 0xA6, 0xA4, 0xA4, 0xA4, 0xA6, 0xA8, 0xBE, 0xC1, - 0xC9, 0xEB, 0xFB, 0xFB, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xEB, 0xC3, 0xC0, 0xAA, 0xA8, - 0xA6, 0xA6, 0xA6, 0xA9, 0xAA, 0xC0, 0xE8, 0xD0, - 0xD2, 0x4C, 0x5E, 0x64, 0xD0, 0xD1, 0x5F, 0xD9, - 0xD5, 0xD1, 0xD0, 0x48, 0x52, 0x5C, 0x64, 0xCD, - 0x5C, 0xDC, 0xD7, 0xD5, 0x62, 0x3F, 0x4C, 0x53, - 0xDA, 0xD7, 0xCE, 0x56, 0x40, 0x4B, 0x52, 0x56, - 0xCE, 0xDF, 0x6A, 0xEB, 0xE9, 0xC9, 0xC3, 0xC0, - 0xC0, 0xBF, 0xBE, 0xAA, 0xBF, 0xC0, 0xC3, 0xC9, - 0xEA, 0xF6, 0xEE, 0x58, 0x57, 0x5E, 0xD6, 0xD0, - 0xD2, 0x61, 0xCB, 0xD6, 0xD6, 0xD4, 0xDF, 0xF3, - 0xF2, 0xDD, 0xD7, 0xEB, 0xC9, 0xC1, 0xC0, 0xBF, - 0xAA, 0xAA, 0xAA, 0xBE, 0xC3, 0xF0, 0xD2, 0xD2, - 0xD2, 0x51, 0x62, 0xCC, 0xD0, 0xCC, 0x61, 0xD3, - 0xCF, 0xCE, 0xD2, 0x48, 0x5A, 0x61, 0xCC, 0xCE, - 0x5F, 0xD9, 0xD5, 0xD1, 0x63, 0x44, 0x56, 0x56, - 0xDC, 0xD9, 0xD4, 0x5E, 0x42, 0x4A, 0x4C, 0x57, - 0x5D, 0xD8, 0xE0, 0xD8, 0xDC, 0xCB, 0x66, 0xEC, - 0xE8, 0xC3, 0xC3, 0xC3, 0xC3, 0xC9, 0xE8, 0xEA, - 0xF6, 0x50, 0x3E, 0x58, 0x57, 0x5A, 0xD6, 0xD4, - 0xCC, 0x4B, 0x53, 0x5C, 0x64, 0xD1, 0xDF, 0xF3, - 0xF1, 0xDE, 0xD9, 0xF6, 0xEB, 0xC9, 0xC1, 0xC1, - 0xC0, 0xC0, 0xC1, 0xC9, 0xF0, 0xD6, 0xCD, 0xD6, - 0xD3, 0x53, 0xCB, 0xCF, 0xCD, 0x5F, 0x5F, 0xCE, - 0xCF, 0xCD, 0xD0, 0x47, 0x5F, 0xCB, 0xCE, 0xCD, - 0x63, 0xD6, 0xD3, 0xD1, 0x63, 0x3F, 0x58, 0x58, - 0xDB, 0xDC, 0xDA, 0x65, 0x3E, 0x49, 0x49, 0x4D, - 0x49, 0xDC, 0xDF, 0xE0, 0xDE, 0xD5, 0x47, 0x47, - 0x46, 0x6B, 0xEB, 0xEA, 0xE9, 0xEA, 0xEB, 0xF6, - 0xD0, 0x57, 0x57, 0x47, 0x47, 0x5B, 0xD4, 0xD4, - 0xCD, 0x44, 0x3E, 0x4B, 0x50, 0x4B, 0x51, 0xD5, - 0xDB, 0xD8, 0xDE, 0x4B, 0xF6, 0xF6, 0xEA, 0xE9, - 0xE8, 0xEA, 0xEB, 0x67, 0x5E, 0xCC, 0xD6, 0xDC, - 0xD5, 0x58, 0xCE, 0xCE, 0x62, 0x50, 0xCC, 0xD3, - 0xD2, 0xCD, 0xCD, 0x4B, 0x64, 0xCE, 0xCE, 0x64, - 0xCC, 0xD3, 0xD2, 0xD2, 0x61, 0x47, 0x5D, 0x5C, - 0xDD, 0xDD, 0xD9, 0xD1, 0x4C, 0x47, 0x49, 0x4A, - 0x4B, 0xD1, 0xD8, 0xE0, 0xDF, 0xDD, 0x5D, 0x4A, - 0x48, 0x52, 0x51, 0x3F, 0xF6, 0xEC, 0xE0, 0xE0, - 0xD3, 0x5E, 0x5F, 0x50, 0x4B, 0x50, 0xCB, 0xCE, - 0x64, 0x45, 0x4C, 0x57, 0x57, 0x58, 0x52, 0xD6, - 0xD3, 0xDE, 0xDF, 0xD1, 0x3E, 0x4B, 0xF6, 0xF6, - 0xEC, 0x66, 0x53, 0x43, 0x56, 0xD1, 0xD9, 0xDE, - 0xD4, 0x5E, 0xCE, 0xCC, 0x5B, 0x2C, 0xD4, 0xD5, - 0xD2, 0xD0, 0x63, 0x5D, 0xCD, 0xD0, 0xCD, 0x5E, - 0xD0, 0xCF, 0xCE, 0xD2, 0x5E, 0x50, 0x60, 0x5D, - 0xDE, 0xDD, 0xDC, 0xD7, 0x5D, 0x45, 0x47, 0x3E, - 0x4B, 0x5E, 0xDE, 0xDF, 0xE0, 0xD8, 0xCF, 0x3E, - 0x45, 0x51, 0x58, 0x42, 0xCB, 0xDA, 0xDE, 0xD8, - 0xD2, 0x61, 0xCC, 0xCF, 0xD6, 0xDA, 0xDA, 0xD5, - 0xD0, 0x50, 0x44, 0x57, 0x57, 0x58, 0x45, 0xD1, - 0xD1, 0xD7, 0xDF, 0xDF, 0xD7, 0xCF, 0x64, 0x60, - 0xCE, 0xCE, 0xCE, 0x63, 0xCF, 0xDA, 0xDE, 0xD9, - 0xCF, 0x63, 0xCD, 0x63, 0x4D, 0x4B, 0xD6, 0xD5, - 0xCE, 0xD3, 0x60, 0xCB, 0xD0, 0xD0, 0x65, 0x47, - 0xD0, 0xCC, 0xCC, 0xD1, 0x59, 0x5D, 0x63, 0x5E, - 0xDD, 0xDD, 0xDE, 0xDC, 0xCB, 0x40, 0x48, 0x45, - 0x3E, 0x3E, 0xD9, 0xDF, 0xE0, 0xDF, 0xDA, 0x51, - 0x4C, 0x48, 0x56, 0x4C, 0x5B, 0xD2, 0xDA, 0xDB, - 0xCB, 0x5F, 0xD0, 0xCC, 0xDC, 0xF0, 0xF3, 0xE0, - 0xDD, 0xCC, 0x41, 0x50, 0x57, 0x57, 0x4B, 0x5D, - 0xD3, 0xD1, 0xDE, 0xDF, 0xDE, 0xD7, 0xD0, 0xD0, - 0xD5, 0xD6, 0xD6, 0xCE, 0xD7, 0xDC, 0xDA, 0xD5, - 0x60, 0x63, 0x64, 0x5E, 0x47, 0x61, 0xD5, 0xD2, - 0xCF, 0xD0, 0x59, 0xCD, 0xD1, 0xCF, 0x61, 0x4D, - 0xCC, 0xCE, 0xCD, 0xD0, 0x52, 0x61, 0x64, 0x60, - 0xDA, 0xDE, 0xDE, 0xDD, 0xD1, 0x4B, 0x4A, 0x45, - 0x3E, 0x41, 0xCD, 0xDE, 0xE0, 0xF1, 0xDE, 0x63, - 0x4A, 0x4A, 0x4A, 0x4B, 0x50, 0xCB, 0xD4, 0xD7, - 0x5E, 0x54, 0x62, 0xD3, 0xD4, 0xF0, 0xF3, 0xF3, - 0xF2, 0xDE, 0x61, 0x40, 0x49, 0x56, 0x4D, 0x3E, - 0x4B, 0xCE, 0xD9, 0xD8, 0xD9, 0xD5, 0xCF, 0xD2, - 0xD6, 0xD6, 0xD1, 0xD1, 0xD7, 0xD5, 0xCF, 0xD0, - 0x54, 0x64, 0x63, 0x56, 0x2C, 0xCB, 0xD1, 0xCC, - 0xD3, 0xCD, 0x54, 0xCF, 0xD1, 0xCE, 0x5E, 0x5C, - 0xCE, 0xCE, 0xCE, 0xCB, 0x4B, 0x63, 0xCC, 0x61, - 0xD4, 0xDC, 0xDE, 0xDE, 0xDA, 0x5D, 0x45, 0x45, - 0x48, 0x3F, 0x52, 0xD9, 0xD8, 0xDF, 0xDF, 0xD2, - 0x52, 0x4B, 0x3E, 0x2E, 0x47, 0x60, 0xCF, 0xD3, - 0x59, 0x48, 0x50, 0x5E, 0xCC, 0xDE, 0xF2, 0xF2, - 0xF3, 0xF3, 0xDD, 0x5D, 0x3E, 0x48, 0x47, 0x47, - 0x58, 0xD1, 0xDA, 0xDA, 0xD5, 0xD1, 0xCD, 0xD2, - 0xD3, 0xCF, 0xD3, 0xD1, 0xCD, 0xD3, 0xD2, 0x5E, - 0x52, 0x64, 0x60, 0x4B, 0x45, 0x61, 0xCD, 0xD3, - 0xD3, 0x64, 0x61, 0xD0, 0xD0, 0x64, 0x45, 0x63, - 0xD0, 0xCE, 0xD0, 0x60, 0x56, 0xCB, 0xCC, 0x62, - 0xCE, 0xDA, 0xDE, 0xD8, 0xDD, 0xCC, 0x45, 0x49, - 0x3E, 0x47, 0x42, 0xD1, 0xDC, 0xD8, 0xD8, 0xD3, - 0x5D, 0x4C, 0x49, 0x3F, 0x47, 0x59, 0xCD, 0xCF, - 0x59, 0x2E, 0x48, 0x47, 0x52, 0x63, 0xF0, 0xF2, - 0xF3, 0xF3, 0xF2, 0xDA, 0x52, 0x4B, 0x52, 0x58, - 0x5E, 0x63, 0xD0, 0xD0, 0xD0, 0xCF, 0xCE, 0xCE, - 0xCF, 0x65, 0x61, 0xD6, 0xD6, 0xD6, 0xCB, 0x4B, - 0x61, 0x62, 0x5D, 0x43, 0x4B, 0x61, 0xD0, 0xD4, - 0xD1, 0x61, 0xCE, 0xD2, 0xCD, 0x5E, 0x4A, 0xCE, - 0xD0, 0xCC, 0xD0, 0x59, 0x61, 0xCC, 0xCC, 0x62, - 0xD1, 0xD5, 0xDE, 0xD8, 0xDD, 0xCF, 0x4B, 0x4A, - 0x45, 0x3E, 0x2D, 0xCB, 0xDC, 0xDE, 0xD8, 0xD5, - 0x60, 0x54, 0x51, 0x4C, 0x4D, 0x5C, 0xCC, 0xCE, - 0x5A, 0x2C, 0x50, 0x53, 0x3E, 0x59, 0xD8, 0xF3, - 0xF2, 0xF3, 0xF3, 0xE0, 0x5E, 0x4A, 0x4C, 0x53, - 0x5E, 0x63, 0xCC, 0xCC, 0xCC, 0xCD, 0xCF, 0xD3, - 0x62, 0x53, 0xD6, 0xD6, 0xD6, 0xD6, 0x5B, 0x48, - 0x64, 0x63, 0x59, 0x44, 0x57, 0x63, 0xD2, 0xD3, - 0xD0, 0x5E, 0xD0, 0xD1, 0xCB, 0x58, 0x4C, 0xCF, - 0xCF, 0xCE, 0xCE, 0x57, 0x63, 0xCC, 0xCD, 0x57, -}; - -unsigned char linux_logo_bw[] __initdata = { - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x3F, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, - 0xFE, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFE, 0x3F, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xC7, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xC3, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, - 0xFB, 0xE3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFD, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xF1, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, - 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF9, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xF9, 0xCF, 0xC3, 0xF8, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x87, 0x81, 0xF9, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xA7, - 0x99, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF9, 0xF3, 0xBC, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xF9, 0xE3, 0xBC, 0xF9, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xB0, 0x3C, 0xF9, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xB0, - 0x19, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF9, 0xC0, 0x03, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xF9, 0x80, 0x01, 0xF8, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x80, 0x01, 0xF8, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x80, - 0x01, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF9, 0xC0, 0x21, 0xD8, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xF9, 0xB1, 0x80, 0xEC, 0xC0, 0x1F, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x90, 0x00, 0xE4, - 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x8C, - 0xC0, 0x7C, 0x04, 0x81, 0xFF, 0xFF, 0xFF, 0xFF, - 0xE3, 0x80, 0x00, 0x7C, 0x40, 0x11, 0xFF, 0xFF, - 0xFF, 0xFF, 0xE3, 0x80, 0x00, 0x7F, 0xD2, 0x29, - 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0x00, 0x00, 0x3F, - 0x80, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0x00, - 0x00, 0x3F, 0x80, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, - 0x1E, 0x00, 0x00, 0x1F, 0x80, 0x19, 0xFF, 0xFF, - 0xFF, 0xFE, 0x1C, 0x00, 0x00, 0x1E, 0x80, 0x19, - 0xFF, 0xFF, 0xFF, 0xFE, 0x3C, 0x00, 0x00, 0x1E, - 0x80, 0x11, 0xFF, 0xFF, 0xFF, 0xFC, 0x7C, 0x00, - 0x00, 0x0F, 0x80, 0x11, 0xFF, 0xFF, 0xFF, 0xFC, - 0xF8, 0x00, 0x00, 0x0E, 0x80, 0x11, 0xFF, 0xFF, - 0xFF, 0xFC, 0xF8, 0x00, 0x00, 0x06, 0x00, 0x11, - 0xFF, 0xFF, 0xFF, 0xF8, 0xF8, 0x00, 0x00, 0x06, - 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF9, 0xF0, 0x00, - 0x00, 0x02, 0x00, 0x09, 0xFF, 0xFF, 0xFF, 0xF1, - 0xF0, 0x00, 0x00, 0x02, 0x80, 0x10, 0xFF, 0xFF, - 0xFF, 0xF1, 0xE0, 0x00, 0x00, 0x00, 0x97, 0x10, - 0xFF, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x00, 0x00, - 0xDF, 0xF0, 0xFF, 0xFF, 0xFF, 0xE3, 0xC0, 0x00, - 0x00, 0x00, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xC7, - 0xC0, 0x00, 0x00, 0x01, 0xFF, 0xF8, 0xFF, 0xFF, - 0xFF, 0xC7, 0x80, 0x00, 0x00, 0x01, 0xFF, 0xF8, - 0xFF, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x00, 0x01, - 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0x8F, 0x80, 0x00, - 0x00, 0x01, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0x9F, - 0x80, 0x00, 0x00, 0x01, 0xFF, 0xF8, 0xFF, 0xFF, - 0xFF, 0x9F, 0x80, 0x00, 0x00, 0x01, 0x80, 0x18, - 0xFF, 0xFF, 0xFF, 0x9E, 0x80, 0x00, 0x00, 0x03, - 0xA8, 0x11, 0xFF, 0xFF, 0xFF, 0x9F, 0x80, 0x00, - 0x00, 0x02, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0x99, - 0x80, 0x00, 0x00, 0x00, 0x00, 0x09, 0xFF, 0xFF, - 0xFF, 0x00, 0x80, 0x00, 0x00, 0x01, 0xC0, 0x01, - 0xFF, 0xFF, 0xFE, 0x20, 0x60, 0x00, 0x00, 0x00, - 0xFF, 0xC3, 0xFF, 0xFF, 0xF8, 0x00, 0x30, 0x00, - 0x00, 0x00, 0xFF, 0x0F, 0xFF, 0xFF, 0xC0, 0x40, - 0x38, 0x00, 0x00, 0x00, 0xFE, 0x47, 0xFF, 0xFF, - 0x81, 0x00, 0x1C, 0x00, 0x00, 0x00, 0xFC, 0x23, - 0xFF, 0xFF, 0x90, 0x00, 0x1E, 0x00, 0x00, 0x00, - 0x78, 0x11, 0xFF, 0xFF, 0x80, 0x00, 0x0F, 0x80, - 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0x80, 0x00, - 0x07, 0xC0, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, - 0xC0, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x04, - 0x7F, 0xFF, 0x80, 0x00, 0x03, 0xC0, 0x00, 0x10, - 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x01, 0x80, - 0x00, 0x30, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x00, - 0x00, 0x00, 0x00, 0x70, 0x00, 0x01, 0x4F, 0xFF, - 0x80, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, - 0x0F, 0xFF, 0xC0, 0x00, 0x00, 0x80, 0x03, 0xF0, - 0x00, 0x00, 0x8F, 0xFF, 0x80, 0x00, 0x00, 0x40, - 0x0F, 0xF0, 0x00, 0x04, 0x1F, 0xFF, 0x80, 0x00, - 0x00, 0x7F, 0xFF, 0xF0, 0x00, 0x10, 0x1F, 0xFF, - 0xC0, 0x00, 0x00, 0x7F, 0xFF, 0xF0, 0x00, 0x40, - 0xFF, 0xFF, 0x98, 0x00, 0x00, 0xFF, 0xFF, 0xF0, - 0x00, 0x83, 0xFF, 0xFF, 0x81, 0xE0, 0x01, 0xFF, - 0xFF, 0xF8, 0x02, 0x07, 0xFF, 0xFF, 0x80, 0x3F, - 0x07, 0xE0, 0x00, 0x1C, 0x0C, 0x1F, 0xFF, 0xFF, - 0xF8, 0x03, 0xFF, 0x80, 0x00, 0x1F, 0x78, 0x1F, - 0xFF, 0xFF, 0xFF, 0x80, 0x7F, 0x00, 0x07, 0x0F, - 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, 0x0C, 0x07, - 0xFF, 0x83, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x1F, 0xFF, 0xC0, 0x03, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x07, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -}; - -unsigned char linux_logo16_red[] __initdata = { - 0x00, 0x90, 0xb0, 0x9c, 0xf7, 0x35, 0x83, 0xa5, - 0x65, 0x8f, 0x98, 0xc9, 0xdb, 0xe1, 0xe7, 0xf8 -}; - -unsigned char linux_logo16_green[] __initdata = { - 0x00, 0x90, 0xb0, 0x9c, 0xf7, 0x2e, 0x83, 0xa5, - 0x65, 0x6e, 0x98, 0x89, 0xbf, 0xac, 0xda, 0xf8 -}; - -unsigned char linux_logo16_blue[] __initdata = { - 0x00, 0x90, 0xaf, 0x9c, 0xf7, 0x2b, 0x82, 0xa5, - 0x65, 0x41, 0x97, 0x1e, 0x60, 0x29, 0xa5, 0xf8 -}; - -unsigned char linux_logo16[] __initdata = { - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa1, 0x11, 0x11, - 0x61, 0x16, 0x66, 0x66, 0x11, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x1a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0x33, 0xa8, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x87, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x73, 0x33, 0x33, 0x3a, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xa3, 0x33, 0x33, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x27, 0x77, 0x77, 0x77, 0x33, 0x3a, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xa3, 0x33, 0x33, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x55, 0x50, 0x08, 0x33, 0x77, 0x77, - 0x77, 0x72, 0x72, 0x27, 0x77, 0x77, 0x33, 0x33, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xa3, 0x33, 0x33, 0x77, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x58, 0x85, 0x00, 0x11, 0x11, 0xaa, - 0xa3, 0x37, 0x77, 0x72, 0x22, 0x22, 0x77, 0x73, - 0x33, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa3, - 0x33, 0x37, 0x77, 0x33, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x56, 0x85, 0x00, 0x06, 0x66, 0x11, - 0x11, 0x1a, 0xa3, 0x37, 0x77, 0x72, 0x22, 0x77, - 0x73, 0x33, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x33, - 0x33, 0x33, 0x33, 0x30, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x55, 0x00, 0x00, 0x06, 0x66, 0x66, - 0x66, 0x66, 0x11, 0x1a, 0xa3, 0x77, 0x72, 0x22, - 0x77, 0x73, 0x3a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x33, 0x33, - 0x33, 0x33, 0x33, 0xa0, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, - 0x66, 0x66, 0x66, 0x66, 0x11, 0xa3, 0x77, 0x22, - 0x22, 0x77, 0x33, 0x33, 0xaa, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x33, 0x33, 0x33, - 0x33, 0x3a, 0xa1, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x33, - 0xaa, 0x11, 0x16, 0x66, 0x66, 0x61, 0x1a, 0x37, - 0x22, 0x22, 0x77, 0x33, 0x3a, 0xaa, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0xa3, 0x33, 0x33, 0x33, - 0x3a, 0xa1, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x22, - 0x22, 0x77, 0x3a, 0x11, 0x66, 0x66, 0x66, 0x1a, - 0x37, 0x22, 0x22, 0x77, 0x33, 0x3a, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0x33, 0x33, 0x33, 0x3a, - 0xa1, 0x11, 0x11, 0x10, 0x00, 0x00, 0x50, 0x00, - 0x00, 0x05, 0x80, 0x50, 0x00, 0x00, 0x07, 0x72, - 0x22, 0x22, 0x22, 0x73, 0xa1, 0x66, 0x66, 0x61, - 0x1a, 0x77, 0x22, 0x27, 0x73, 0x33, 0xaa, 0xaa, - 0xaa, 0xaa, 0xaa, 0xaa, 0x33, 0x33, 0x3a, 0xaa, - 0x11, 0x11, 0x1a, 0xa0, 0x08, 0x71, 0x05, 0x00, - 0x00, 0x12, 0x22, 0x50, 0x00, 0x00, 0x07, 0x77, - 0x77, 0x72, 0x22, 0x22, 0x27, 0x31, 0x16, 0x66, - 0x61, 0x13, 0x77, 0x22, 0x77, 0x33, 0x3a, 0xaa, - 0xaa, 0xaa, 0xaa, 0xa3, 0x33, 0x33, 0xaa, 0xa1, - 0x11, 0x1a, 0x33, 0x70, 0x07, 0x2e, 0x70, 0x00, - 0x01, 0x44, 0x42, 0x60, 0x00, 0x00, 0x02, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x27, 0x31, 0x66, - 0x66, 0x61, 0xa3, 0x72, 0x22, 0x77, 0x33, 0xaa, - 0xaa, 0xaa, 0xa3, 0x33, 0x33, 0xaa, 0xaa, 0x11, - 0x1a, 0x33, 0x77, 0x30, 0x04, 0x82, 0x40, 0x00, - 0x54, 0x48, 0x54, 0x40, 0x00, 0x00, 0x01, 0xaa, - 0x32, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x31, - 0x66, 0x66, 0x11, 0x37, 0x22, 0x27, 0x73, 0x3a, - 0xaa, 0xaa, 0xa3, 0x33, 0x3a, 0xaa, 0xaa, 0xaa, - 0xa3, 0x77, 0xaa, 0x10, 0x50, 0x08, 0x46, 0x05, - 0x54, 0x80, 0x50, 0x42, 0x00, 0x00, 0x08, 0x66, - 0x66, 0x1a, 0x32, 0x22, 0x22, 0x22, 0x22, 0x27, - 0x31, 0x66, 0x66, 0x13, 0x72, 0x22, 0x77, 0x33, - 0xaa, 0xaa, 0xaa, 0x33, 0xaa, 0xa1, 0xaa, 0xa3, - 0x37, 0xa1, 0x1a, 0x30, 0x50, 0x06, 0x26, 0x00, - 0x54, 0x00, 0x00, 0x44, 0x00, 0x00, 0x08, 0xe2, - 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0x22, 0x22, - 0x27, 0xa6, 0x66, 0x61, 0xa7, 0x72, 0x27, 0x73, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x33, - 0x31, 0x11, 0x37, 0x70, 0x02, 0x00, 0xab, 0xbb, - 0xb6, 0x00, 0x00, 0xf4, 0x00, 0x00, 0xee, 0xee, - 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0x22, - 0x22, 0x23, 0x16, 0x66, 0x1a, 0x37, 0x22, 0x77, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa3, 0x3a, - 0x11, 0xa7, 0x33, 0x10, 0x04, 0x09, 0xbd, 0xdd, - 0xbd, 0xd0, 0x04, 0x45, 0x00, 0x0e, 0xee, 0xee, - 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0x22, - 0x22, 0x22, 0x71, 0x66, 0x66, 0x13, 0x72, 0x27, - 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x33, 0x11, - 0xa3, 0x73, 0xa1, 0x60, 0x08, 0xbd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdb, 0x90, 0x00, 0x02, 0xec, 0xee, - 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xce, 0x22, - 0x22, 0x22, 0x27, 0xa6, 0x66, 0x61, 0x37, 0x27, - 0x1a, 0xaa, 0xaa, 0xaa, 0xaa, 0xa3, 0xa1, 0x1a, - 0x33, 0xa1, 0x16, 0x60, 0x0b, 0xbd, 0xdd, 0xdd, - 0xcd, 0xdd, 0xdd, 0xd9, 0x00, 0x00, 0xec, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xce, 0xa2, - 0x22, 0x22, 0x22, 0x7a, 0x66, 0x66, 0x13, 0x77, - 0x1a, 0xaa, 0xaa, 0xaa, 0xaa, 0x3a, 0x11, 0x33, - 0xaa, 0x11, 0x66, 0x60, 0x9b, 0xdd, 0xdd, 0xdd, - 0xcd, 0xdd, 0xdb, 0xb9, 0x00, 0x00, 0xec, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xee, 0x61, - 0x72, 0x22, 0x22, 0x22, 0xa1, 0x66, 0x61, 0x37, - 0x1a, 0xaa, 0xaa, 0xaa, 0xa3, 0xa1, 0x13, 0x3a, - 0x11, 0x11, 0x11, 0x10, 0x5b, 0xdd, 0xdd, 0xdc, - 0xdd, 0xdd, 0xbd, 0xd9, 0x00, 0x00, 0xec, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xee, 0x86, - 0x17, 0x22, 0x22, 0x22, 0x23, 0x16, 0x66, 0xaa, - 0xaa, 0xa3, 0x3a, 0xaa, 0xaa, 0x1a, 0x3a, 0xa1, - 0x11, 0x11, 0x1a, 0x70, 0x05, 0xbd, 0xdd, 0xdd, - 0xdb, 0x5b, 0xdd, 0xb0, 0x00, 0x60, 0x2e, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xe6, 0x88, - 0x66, 0x32, 0x22, 0x22, 0x22, 0x36, 0x66, 0x11, - 0x33, 0x33, 0x3a, 0xaa, 0x11, 0xaa, 0xaa, 0xa1, - 0x11, 0x1a, 0x3a, 0x60, 0x02, 0x99, 0xbb, 0xb9, - 0x9b, 0xbb, 0xbc, 0x22, 0x00, 0x86, 0x5e, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xe1, 0x68, - 0x86, 0x63, 0x22, 0x22, 0x22, 0x2a, 0x66, 0x66, - 0x33, 0x33, 0xaa, 0xaa, 0x1a, 0xaa, 0xaa, 0x11, - 0x1a, 0xa7, 0x68, 0x80, 0x02, 0x2b, 0xbd, 0xbb, - 0xbb, 0xb9, 0x22, 0x22, 0x00, 0x06, 0x6e, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc7, 0xa6, - 0x88, 0x86, 0x32, 0x22, 0x22, 0x27, 0xa6, 0x66, - 0x33, 0x3a, 0xaa, 0xa1, 0xaa, 0xaa, 0xa1, 0x11, - 0xa3, 0xa6, 0x88, 0x80, 0x02, 0x22, 0x9b, 0xbb, - 0xbb, 0x22, 0x24, 0xf4, 0x60, 0x00, 0x0c, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc2, 0x21, - 0x68, 0x88, 0x63, 0x22, 0x22, 0x22, 0x71, 0x66, - 0x33, 0x3a, 0x11, 0x11, 0xaa, 0xaa, 0x11, 0xaa, - 0x71, 0x88, 0x88, 0x00, 0x02, 0xe2, 0x26, 0x99, - 0x22, 0x22, 0x4f, 0xf4, 0x40, 0x00, 0x0c, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x22, 0x22, - 0x16, 0x88, 0x86, 0xa2, 0x22, 0x22, 0x27, 0x11, - 0x33, 0xa1, 0x11, 0x11, 0xaa, 0x31, 0x1a, 0xa3, - 0x68, 0x88, 0x81, 0x00, 0x54, 0x42, 0x22, 0x22, - 0x22, 0x44, 0xff, 0xff, 0x48, 0x00, 0x00, 0x99, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x22, 0x22, - 0x21, 0x88, 0x88, 0x6a, 0x22, 0x22, 0x22, 0x31, - 0x3a, 0xa1, 0x11, 0x1a, 0xa3, 0x11, 0x33, 0x36, - 0x88, 0x86, 0x30, 0x00, 0x4f, 0x44, 0x22, 0x22, - 0x24, 0xff, 0xff, 0xff, 0x44, 0x00, 0x00, 0x99, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x95, 0x22, 0x72, - 0x22, 0x18, 0x88, 0x86, 0x32, 0x22, 0x22, 0x27, - 0xaa, 0x11, 0x11, 0x1a, 0x31, 0x13, 0x33, 0x68, - 0x88, 0x6a, 0x00, 0x02, 0x4f, 0x4f, 0x42, 0x24, - 0x4f, 0xff, 0xff, 0xff, 0xf4, 0x50, 0x00, 0x99, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x22, 0x73, - 0x72, 0x26, 0x88, 0x88, 0x63, 0x22, 0x22, 0x22, - 0x11, 0x11, 0x11, 0xa3, 0xa1, 0x73, 0xa6, 0x88, - 0x81, 0xa5, 0x00, 0x04, 0x4f, 0x4f, 0x44, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x40, 0x00, 0x99, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x12, 0x27, - 0xaa, 0x22, 0x68, 0x55, 0x86, 0x72, 0x22, 0x22, - 0x11, 0x11, 0x1a, 0x33, 0x13, 0x3a, 0x18, 0x88, - 0x1a, 0x10, 0x00, 0x44, 0x4f, 0x4f, 0xff, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x99, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x61, 0x22, - 0x3a, 0xa2, 0x26, 0x85, 0x58, 0x67, 0x22, 0x22, - 0x61, 0x61, 0x1a, 0x7a, 0x37, 0x31, 0x88, 0x81, - 0x11, 0x00, 0x05, 0xe4, 0x44, 0xff, 0xff, 0xff, - 0x4f, 0xf4, 0x44, 0xff, 0xff, 0xf5, 0x00, 0x99, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x88, 0x12, - 0x2a, 0xaa, 0x72, 0x68, 0x55, 0x81, 0x22, 0x22, - 0x66, 0x61, 0xa3, 0x33, 0x73, 0x16, 0x88, 0x11, - 0x10, 0x00, 0x08, 0x74, 0x44, 0x4f, 0x44, 0x44, - 0xf4, 0xf4, 0x44, 0x44, 0xe2, 0x44, 0x00, 0x99, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x88, 0x81, - 0x22, 0xaa, 0xa7, 0x26, 0x85, 0x88, 0x12, 0x22, - 0x66, 0x61, 0x37, 0xa7, 0x3a, 0x66, 0x66, 0x11, - 0x80, 0x00, 0x0a, 0x72, 0x44, 0x4f, 0x44, 0x4f, - 0xff, 0x44, 0x44, 0x22, 0x22, 0x24, 0x00, 0x99, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x85, 0x88, - 0x12, 0x2a, 0xaa, 0x22, 0x68, 0x58, 0x63, 0x22, - 0x66, 0x1a, 0x73, 0x77, 0x31, 0x66, 0x61, 0x11, - 0x00, 0x00, 0x07, 0x44, 0xff, 0x4f, 0xf4, 0x4f, - 0xff, 0x4f, 0x44, 0xf4, 0x42, 0x22, 0x40, 0x9b, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb9, 0x85, 0x55, - 0x81, 0x27, 0xaa, 0xa2, 0x78, 0x88, 0x86, 0x72, - 0x66, 0x13, 0x77, 0x73, 0x11, 0x66, 0x61, 0x76, - 0x00, 0x50, 0x84, 0xf4, 0xff, 0x4f, 0xf4, 0xff, - 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x42, 0x40, 0x9b, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb9, 0x68, 0x55, - 0x58, 0x12, 0x3a, 0xaa, 0x23, 0x88, 0x88, 0xa7, - 0x66, 0xa7, 0x77, 0x7a, 0x16, 0x66, 0x1a, 0x15, - 0x05, 0x00, 0x4f, 0xf4, 0xff, 0x4f, 0xf4, 0xff, - 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x44, 0x24, 0x9b, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb9, 0x26, 0x55, - 0x55, 0x81, 0x23, 0xaa, 0x32, 0x18, 0x88, 0x6a, - 0x61, 0x37, 0x77, 0x31, 0x66, 0x66, 0x17, 0x60, - 0x05, 0x08, 0x4f, 0xf4, 0xff, 0x4f, 0xf4, 0xff, - 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x4f, 0x4e, 0x99, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0xa2, 0x65, - 0x55, 0x58, 0xa2, 0x7a, 0xa2, 0x26, 0x88, 0x61, - 0x61, 0x32, 0x27, 0xa1, 0x66, 0x61, 0x31, 0x60, - 0x00, 0x04, 0x4f, 0xf4, 0xff, 0x44, 0x44, 0xff, - 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x44, 0xf4, 0x99, - 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x9b, 0xaa, 0x26, - 0x55, 0x55, 0x87, 0x27, 0x33, 0x27, 0x68, 0x61, - 0x1a, 0x72, 0x27, 0xa6, 0x66, 0x6a, 0x71, 0x00, - 0x80, 0x84, 0xff, 0xf4, 0xff, 0x44, 0x44, 0xff, - 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x44, 0xf4, 0x99, - 0x9b, 0x9b, 0x99, 0xb9, 0xb9, 0x99, 0xaa, 0xa2, - 0x85, 0x55, 0x56, 0x22, 0x27, 0x22, 0x36, 0x66, - 0x13, 0x22, 0x23, 0x16, 0x86, 0x63, 0x73, 0x00, - 0x00, 0x44, 0xf4, 0xf4, 0xff, 0x44, 0x44, 0xff, - 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x4f, 0x4f, 0x99, - 0x9b, 0x99, 0x99, 0x99, 0xb9, 0x99, 0xaa, 0xaa, - 0x28, 0x55, 0x58, 0x12, 0x22, 0x22, 0x21, 0x11, - 0xa3, 0x27, 0x7a, 0x66, 0x86, 0x17, 0x75, 0x05, - 0x05, 0xff, 0xf4, 0xf4, 0xff, 0x44, 0x44, 0xff, - 0xff, 0x4f, 0x44, 0x4f, 0x4f, 0x44, 0x4f, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x3a, 0xaa, - 0xa2, 0x85, 0x58, 0x67, 0x72, 0x22, 0x27, 0xa1, - 0x37, 0x27, 0x7a, 0x68, 0x86, 0xa2, 0x70, 0x00, - 0x02, 0xff, 0xf4, 0xf4, 0xff, 0x44, 0x44, 0x4f, - 0xff, 0x4f, 0x44, 0xf4, 0xf4, 0xf4, 0xf4, 0x99, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x23, 0xaa, - 0xa7, 0x78, 0x88, 0x81, 0x77, 0x22, 0x27, 0x3a, - 0x72, 0x73, 0x71, 0x68, 0x66, 0x32, 0x50, 0x00, - 0x04, 0x4f, 0xf4, 0xf4, 0xff, 0x44, 0x44, 0x4f, - 0xff, 0x4f, 0x44, 0xf4, 0xf4, 0xf4, 0x44, 0x95, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x55, 0x12, 0x3a, - 0xaa, 0x21, 0x88, 0x81, 0x77, 0x27, 0x73, 0x73, - 0x72, 0x33, 0x36, 0x86, 0x61, 0x72, 0x00, 0x00, - 0x04, 0x44, 0xf4, 0xf4, 0xf4, 0x44, 0x44, 0x4f, - 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x4f, 0x44, 0x55, - 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x8a, 0x27, - 0xaa, 0x77, 0x68, 0x61, 0x23, 0x71, 0x11, 0x3a, - 0x27, 0xa3, 0x36, 0x86, 0x61, 0x20, 0x00, 0x00, - 0x04, 0xf4, 0xf4, 0xf4, 0xf4, 0x44, 0x44, 0x4f, - 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x4f, 0x41, 0x59, - 0x99, 0x99, 0x99, 0x99, 0x99, 0x95, 0x58, 0x77, - 0x27, 0x32, 0x36, 0x63, 0x23, 0x71, 0x66, 0x11, - 0x27, 0x13, 0xa6, 0x86, 0x6a, 0x20, 0x00, 0x50, - 0x04, 0x4f, 0x4f, 0x4f, 0x4f, 0x44, 0x44, 0x4f, - 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x4f, 0x41, 0x99, - 0x9b, 0xbb, 0xbb, 0xbb, 0xb9, 0x99, 0x68, 0x13, - 0x32, 0x22, 0x73, 0xa7, 0x2a, 0x31, 0x88, 0x66, - 0x7a, 0x13, 0x18, 0x66, 0x63, 0x20, 0x00, 0x06, - 0x0f, 0x4f, 0x4f, 0x4f, 0x4f, 0x44, 0x44, 0x4f, - 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x4f, 0x49, 0x95, - 0xa9, 0xa9, 0x99, 0x97, 0x92, 0x99, 0x65, 0x6a, - 0x17, 0x22, 0x23, 0x72, 0x27, 0xaa, 0x88, 0x88, - 0xa1, 0x17, 0x68, 0x66, 0x67, 0x70, 0x00, 0x05, - 0x0f, 0x4f, 0x4f, 0x4f, 0x4f, 0x44, 0x44, 0x4f, - 0xff, 0x4f, 0x44, 0xff, 0xf4, 0xf4, 0x49, 0x9c, - 0x2e, 0xee, 0xee, 0xee, 0xee, 0xa9, 0x65, 0x8a, - 0x1a, 0xaa, 0x37, 0x72, 0x27, 0x37, 0x88, 0x88, - 0x11, 0x17, 0x68, 0x66, 0x67, 0x10, 0x9d, 0xd0, - 0x84, 0x44, 0xff, 0x4f, 0x4f, 0x44, 0xf4, 0x4f, - 0xff, 0x4f, 0x44, 0xff, 0xf4, 0xf4, 0x4f, 0x69, - 0xcc, 0xee, 0xee, 0xee, 0xec, 0x99, 0x88, 0x63, - 0x61, 0x68, 0x61, 0x72, 0x22, 0x7a, 0x68, 0x88, - 0x11, 0x17, 0x88, 0x66, 0x12, 0x1b, 0xdd, 0xdd, - 0x02, 0x44, 0x4f, 0x4f, 0x4f, 0x44, 0x44, 0x4f, - 0xff, 0x4f, 0x44, 0xff, 0xff, 0x4f, 0x4c, 0xc5, - 0x0c, 0xc1, 0x11, 0x1c, 0xc0, 0x26, 0x66, 0x17, - 0x66, 0x88, 0x88, 0x12, 0x22, 0x23, 0xa8, 0x88, - 0x11, 0x13, 0x88, 0x66, 0x17, 0xbb, 0xdd, 0xdd, - 0xd0, 0x8f, 0xff, 0xf4, 0xf4, 0x44, 0xf4, 0x4f, - 0xff, 0x4f, 0x44, 0xf4, 0x4f, 0x44, 0xdd, 0xdd, - 0x00, 0x00, 0x00, 0x05, 0x9d, 0x21, 0x66, 0x27, - 0xa6, 0x65, 0x58, 0x67, 0x22, 0x27, 0x28, 0x88, - 0x11, 0xaa, 0x86, 0x68, 0x1a, 0xbb, 0xdd, 0xdd, - 0xdb, 0x05, 0xf4, 0xf4, 0xf4, 0xf4, 0x44, 0x4f, - 0xff, 0x4f, 0x44, 0xf4, 0xf4, 0xf4, 0xdd, 0xdb, - 0x00, 0x00, 0x00, 0x00, 0xdd, 0xda, 0x66, 0x22, - 0x71, 0x15, 0x55, 0x81, 0x22, 0x22, 0x76, 0x88, - 0x11, 0x31, 0x88, 0x88, 0xab, 0xbd, 0xdd, 0xdd, - 0xdd, 0x00, 0x04, 0x44, 0xff, 0xff, 0x4f, 0x4f, - 0xff, 0x4f, 0x44, 0xf4, 0xf4, 0x44, 0xdd, 0xdb, - 0x00, 0x00, 0x00, 0x0b, 0xdd, 0xda, 0x11, 0x22, - 0x23, 0x68, 0x55, 0x86, 0x22, 0x22, 0x7a, 0x88, - 0x1a, 0x71, 0x88, 0x89, 0xbb, 0xdd, 0xdd, 0xdd, - 0xdd, 0xd0, 0x00, 0x4f, 0x44, 0xff, 0x4f, 0x4f, - 0xff, 0x4f, 0x44, 0xf4, 0xff, 0xe2, 0xdd, 0xdb, - 0x90, 0x00, 0x05, 0xbd, 0xdd, 0xb8, 0x63, 0x22, - 0x27, 0xa6, 0x55, 0x88, 0x77, 0x22, 0x22, 0x88, - 0x1a, 0x28, 0xbd, 0xdb, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdb, 0x00, 0x07, 0x44, 0x4f, 0x4f, 0x4f, - 0xff, 0x4f, 0x44, 0x4f, 0x4f, 0x22, 0xdd, 0xdb, - 0xbb, 0x9b, 0xbb, 0xbd, 0xdd, 0xd5, 0x86, 0x22, - 0x22, 0x77, 0x85, 0x88, 0x17, 0x22, 0x22, 0x88, - 0xaa, 0x2b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0x00, 0x00, 0x54, 0x4f, 0x4f, 0x4f, - 0xff, 0x4f, 0x44, 0xf4, 0x44, 0x22, 0xbd, 0xdd, - 0xbb, 0xbb, 0xbb, 0xdd, 0xdd, 0xdd, 0x88, 0x72, - 0x27, 0x22, 0x88, 0x88, 0x67, 0x72, 0x22, 0x18, - 0x33, 0x2d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xd0, 0x00, 0x05, 0x4f, 0x4f, 0x4f, - 0xff, 0x4f, 0x44, 0x44, 0x4f, 0x22, 0xbd, 0xdd, - 0xdb, 0xbb, 0xdd, 0xdd, 0xdd, 0xdd, 0x88, 0x17, - 0x27, 0x72, 0x68, 0x88, 0x87, 0x32, 0x22, 0x36, - 0x37, 0x2d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xd5, 0x00, 0x00, 0x4f, 0x4f, 0x4f, - 0xff, 0xf4, 0xf4, 0xf4, 0xf4, 0x22, 0xbb, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd8, 0x67, - 0x72, 0x77, 0x38, 0x88, 0x83, 0x37, 0x22, 0x26, - 0x72, 0x2b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0x00, 0x00, 0x4f, 0x4f, 0x4f, - 0xff, 0xf4, 0xf4, 0xf4, 0x44, 0x25, 0xbb, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd3, - 0x32, 0x73, 0x76, 0x88, 0x81, 0x33, 0x22, 0x2a, - 0x22, 0x2b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xb0, 0x54, 0x4f, 0x4f, 0x4f, - 0xff, 0xf4, 0xf4, 0xff, 0x44, 0x00, 0xbb, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xa7, 0x73, 0x26, 0x88, 0x86, 0x7a, 0x72, 0x27, - 0x22, 0x2b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdb, 0x44, 0xff, 0x4f, 0x4f, - 0xff, 0xf4, 0xf4, 0x44, 0x40, 0x05, 0xbb, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0x13, 0x23, 0x21, 0x68, 0x86, 0x17, 0x72, 0x22, - 0x22, 0x2b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdb, 0x44, 0x4f, 0x4f, 0x4f, - 0xff, 0xff, 0x44, 0x42, 0x00, 0x05, 0xbd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0x87, 0x27, 0x27, 0x16, 0x66, 0x67, 0x22, 0x22, - 0x72, 0x7b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0x94, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x00, 0x00, 0x05, 0xbb, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xb8, - 0x86, 0x22, 0x22, 0x7a, 0x68, 0x81, 0x22, 0x22, - 0x37, 0x7b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdb, 0xb5, 0x44, 0x44, 0x44, - 0x44, 0x47, 0x00, 0x00, 0x00, 0x05, 0xbd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd8, 0x68, - 0x58, 0x72, 0x22, 0x27, 0x18, 0x86, 0x72, 0x22, - 0x1a, 0xbb, 0xbd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdb, 0xb5, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xbb, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xb9, 0x18, 0x85, - 0x58, 0x12, 0x22, 0x36, 0x18, 0x88, 0x32, 0x22, - 0x61, 0x3b, 0xbb, 0xbb, 0xbd, 0xdd, 0xdd, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdb, 0xb9, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xbb, 0xdd, - 0xdd, 0xdd, 0xdd, 0xdd, 0xb9, 0x7a, 0x68, 0x85, - 0x88, 0x62, 0x27, 0x16, 0x18, 0x88, 0x12, 0x27, - 0x86, 0x18, 0x9b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, - 0xdd, 0xdd, 0xdd, 0xbb, 0xb5, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xbb, 0xbd, - 0xdd, 0xdd, 0xdb, 0xbb, 0x87, 0x31, 0x68, 0x65, - 0x88, 0x82, 0x23, 0x16, 0x18, 0x88, 0x12, 0x23, - 0x88, 0x67, 0x27, 0xa8, 0x9b, 0xbb, 0xbb, 0xbb, - 0xbd, 0xdd, 0xbb, 0xbb, 0x95, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x9b, 0xbb, - 0xbb, 0xbb, 0xbb, 0x96, 0x87, 0x16, 0x68, 0x18, - 0x88, 0x62, 0x31, 0x66, 0x18, 0x88, 0x62, 0x73, - 0x88, 0x63, 0x27, 0x33, 0x65, 0x55, 0x99, 0x9b, - 0xbb, 0xbb, 0xbb, 0x99, 0x55, 0x0a, 0xa1, 0x86, - 0x81, 0x68, 0x88, 0x55, 0x58, 0x85, 0x9b, 0xbb, - 0xbb, 0xbb, 0x95, 0x88, 0x83, 0x66, 0x66, 0x18, - 0x66, 0x82, 0xa1, 0x66, 0x18, 0x88, 0x62, 0x33, - 0x88, 0x81, 0x27, 0x7a, 0x18, 0x58, 0x86, 0x85, - 0x99, 0x99, 0x99, 0x95, 0x53, 0x2a, 0xaa, 0x88, - 0x67, 0x31, 0x68, 0x55, 0x58, 0x85, 0x59, 0xbb, - 0xbb, 0xb9, 0x58, 0x68, 0x83, 0x66, 0x61, 0x16, - 0x66, 0x62, 0x16, 0x66, 0x68, 0x88, 0x62, 0xaa, - 0x88, 0x86, 0x27, 0x77, 0x78, 0x55, 0x88, 0x22, - 0x25, 0x55, 0x95, 0x55, 0x6a, 0xa2, 0x2a, 0x88, - 0x62, 0x27, 0x37, 0x38, 0x88, 0x87, 0x55, 0x59, - 0x95, 0x58, 0x16, 0x88, 0x8a, 0x66, 0x63, 0x68, - 0x86, 0x67, 0x66, 0x66, 0x68, 0x88, 0x12, 0x11, - 0x88, 0x88, 0x72, 0x77, 0x78, 0x85, 0x58, 0x17, - 0x23, 0x32, 0x55, 0x55, 0x81, 0x13, 0x73, 0x66, - 0x62, 0x7a, 0xaa, 0x38, 0x88, 0x58, 0x27, 0x55, - 0x58, 0x32, 0x38, 0x88, 0x81, 0x66, 0xa2, 0x88, - 0x86, 0x61, 0x66, 0x61, 0x66, 0x68, 0x13, 0x11, - 0x88, 0x88, 0x12, 0x22, 0x71, 0x85, 0x58, 0x62, - 0x23, 0xa2, 0x68, 0x88, 0x81, 0x66, 0x88, 0x88, - 0x63, 0x2a, 0xaa, 0x28, 0x88, 0x55, 0x86, 0x61, - 0x66, 0x66, 0x68, 0x88, 0x66, 0x66, 0x77, 0x88, - 0x68, 0x16, 0x66, 0x62, 0x66, 0x68, 0xa1, 0x61, - 0x88, 0x88, 0x62, 0x22, 0x22, 0x85, 0x55, 0x83, - 0x72, 0x37, 0xa8, 0x88, 0x61, 0x66, 0x85, 0x55, - 0x86, 0x23, 0xaa, 0x71, 0x88, 0x85, 0x88, 0x66, - 0x88, 0x86, 0x88, 0x88, 0x16, 0x61, 0x21, 0x88, - 0x66, 0xa6, 0x86, 0x17, 0x66, 0x66, 0x31, 0x61, - 0x88, 0x88, 0x87, 0x72, 0x22, 0x68, 0x55, 0x86, - 0x77, 0x77, 0x36, 0x88, 0x13, 0x68, 0x85, 0x55, - 0x58, 0x12, 0x73, 0x72, 0x76, 0x88, 0x88, 0x68, - 0x88, 0x88, 0x88, 0x66, 0x36, 0x63, 0x26, 0x86, - 0x86, 0x36, 0x86, 0x11, 0x66, 0x66, 0x76, 0x61, - 0x88, 0x88, 0x81, 0x22, 0x22, 0x38, 0x85, 0x58, - 0x37, 0x22, 0x21, 0x68, 0xa2, 0x31, 0x68, 0x55, - 0x55, 0x81, 0x22, 0x22, 0xa8, 0x88, 0x88, 0x68, - 0x86, 0x88, 0x68, 0x81, 0x36, 0x17, 0x21, 0x68, - 0x86, 0x16, 0x66, 0x26, 0x66, 0x61, 0x36, 0x66, - 0x68, 0x88, 0x86, 0x27, 0x22, 0x28, 0x88, 0x88, - 0x17, 0x72, 0x2a, 0x66, 0xa2, 0x22, 0x36, 0x55, - 0x55, 0x58, 0x37, 0x3a, 0x16, 0x66, 0x66, 0x66, - 0x66, 0x18, 0x88, 0x67, 0x16, 0x12, 0x71, 0x68, - 0x81, 0x68, 0x61, 0x76, 0x66, 0x6a, 0x16, 0x66, - 0x88, 0x88, 0x86, 0x77, 0x22, 0x26, 0x88, 0x88, - 0x13, 0x37, 0x71, 0x66, 0xa2, 0x33, 0x2a, 0x85, - 0x55, 0x55, 0x17, 0x73, 0x16, 0x66, 0x66, 0x68, - 0x63, 0x88, 0x88, 0xa2, 0x66, 0xa2, 0xa6, 0x88, - 0x61, 0x68, 0x6a, 0x76, 0x66, 0x6a, 0x66, 0x6a -}; - -/* Painted by Johnny Stenback <jst@uwasa.fi> */ - -unsigned char *linux_serial_image __initdata = "\n" -" .u$e.\n" -" .$$$$$:S\n" -" $\"*$/\"*$$\n" -" $.`$ . ^F\n" -" 4k+#+T.$F\n" -" 4P+++\"$\"$\n" -" :R\"+ t$$B\n" -" ___# $$$\n" -" | | R$$k\n" -" dd. | Linux $!$\n" -" ddd | PPC $9$F\n" -" '!!!!!$ !!#!`\n" -" !!!!!* .!!!!!`\n" -"'!!!!!!!W..e$$!!!!!!` %s\n" -" \"~^^~ ^~~^\n" -"\n"; +#define INCLUDE_LINUX_LOGOBW +#define INCLUDE_LINUX_LOGO16 +#include <linux/linux_logo.h> #else @@ -1469,8 +37,5 @@ extern unsigned char linux_logo16_red[]; extern unsigned char linux_logo16_green[]; extern unsigned char linux_logo16_blue[]; extern unsigned char linux_logo16[]; -extern unsigned char *linux_serial_image; - -extern int (*console_show_logo)(void); #endif diff --git a/include/asm-ppc/machdep.h b/include/asm-ppc/machdep.h new file mode 100644 index 000000000..65d53cb38 --- /dev/null +++ b/include/asm-ppc/machdep.h @@ -0,0 +1,12 @@ +#ifndef _PPC_MACHDEP_H +#define _PPC_MACHDEP_H + +#include <linux/config.h> + +#ifdef CONFIG_APUS +#include <asm-m68k/machdep.h> +#endif + +#endif /* _PPC_MACHDEP_H */ + + diff --git a/include/asm-ppc/page.h b/include/asm-ppc/page.h index 0eaf390aa..77fe08f4a 100644 --- a/include/asm-ppc/page.h +++ b/include/asm-ppc/page.h @@ -80,8 +80,7 @@ typedef unsigned long pgprot_t; #define MAP_NR(addr) (((unsigned long)addr-PAGE_OFFSET) >> PAGE_SHIFT) #define MAP_PAGE_RESERVED (1<<15) -extern unsigned long get_prezerod_page(void); - +extern unsigned long get_zero_page_fast(void); #endif /* __KERNEL__ */ #endif /* __ASSEMBLY__ */ #endif /* _PPC_PAGE_H */ diff --git a/include/asm-ppc/pgtable.h b/include/asm-ppc/pgtable.h index d4111172b..96ccf6544 100644 --- a/include/asm-ppc/pgtable.h +++ b/include/asm-ppc/pgtable.h @@ -7,6 +7,7 @@ #include <linux/mm.h> #include <asm/processor.h> /* For TASK_SIZE */ #include <asm/mmu.h> +#include <asm/page.h> extern void local_flush_tlb_all(void); extern void local_flush_tlb_mm(struct mm_struct *mm); @@ -14,17 +15,10 @@ extern void local_flush_tlb_page(struct vm_area_struct *vma, unsigned long vmadd extern void local_flush_tlb_range(struct mm_struct *mm, unsigned long start, unsigned long end); -#ifndef __SMP__ -#define flush_tlb_all local_flush_tlb_all -#define flush_tlb_mm local_flush_tlb_mm -#define flush_tlb_page local_flush_tlb_page -#define flush_tlb_range local_flush_tlb_range -#else /* __SMP__ */ #define flush_tlb_all local_flush_tlb_all #define flush_tlb_mm local_flush_tlb_mm #define flush_tlb_page local_flush_tlb_page #define flush_tlb_range local_flush_tlb_range -#endif /* __SMP__ */ /* * No cache flushing is required when address mappings are @@ -64,7 +58,7 @@ extern pte_t *va_to_pte(struct task_struct *tsk, unsigned long address); * additional page protection (when Mx_CTR.PPCS = 1) that allows TLB hit * based upon user/super access. The TLB does not have accessed nor write * protect. We assume that if the TLB get loaded with an entry it is - * accessed, and overload the the changed bit for write protect. We use + * accessed, and overload the changed bit for write protect. We use * two bits in the software pte that are supposed to be set to zero in * the TLB entry (24 and 25) for these indicators. Although the level 1 * descriptor contains the guarded and writethrough/copyback bits, we can @@ -110,6 +104,7 @@ extern pte_t *va_to_pte(struct task_struct *tsk, unsigned long address); #define VMALLOC_OFFSET (0x4000000) /* 64M */ #define VMALLOC_START ((((long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))) #define VMALLOC_VMADDR(x) ((unsigned long)(x)) +#define VMALLOC_END 0xf0000000 /* * Bits in a linux-style PTE. These match the bits in the @@ -370,36 +365,61 @@ extern inline pte_t * pte_offset(pmd_t * dir, unsigned long address) /* - * Allocate and free page tables. The xxx_kernel() versions are - * used to allocate a kernel page table, but are actually identical - * to the xxx() versions. + * This is handled very differently on the PPC since out page tables + * are all 0's and I want to be able to use these zero'd pages elsewhere + * as well - it gives us quite a speedup. + * + * Note that the SMP/UP versions are the same since we don't need a + * per cpu list of zero pages since we do the zero-ing with the cache + * off and the access routines are lock-free but the pgt cache stuff + * _IS_ per-cpu since it isn't done with any lock-free access routines + * (although I think we need arch-specific routines so I can do lock-free). + * + * I need to generalize this so we can use it for other arch's as well. + * -- Cort */ -#ifdef __SMP__ -/* Sliiiicck */ -#define pgd_quicklist (cpu_data[smp_processor_id()].pgd_quick) -#define pmd_quicklist ((unsigned long *)0) -#define pte_quicklist (cpu_data[smp_processor_id()].pte_quick) -#define pgtable_cache_size (cpu_data[smp_processor_id()].pgtable_cache_sz) -#else extern struct pgtable_cache_struct { unsigned long *pgd_cache; unsigned long *pte_cache; unsigned long pgtable_cache_sz; + unsigned long *zero_cache; /* head linked list of pre-zero'd pages */ + unsigned long zero_sz; /* # currently pre-zero'd pages */ + unsigned long zeropage_hits; /* # zero'd pages request that we've done */ + unsigned long zeropage_calls; /* # zero'd pages request that've been made */ + unsigned long zerototal; /* # pages zero'd over time */ } quicklists; + +#ifdef __SMP__ +/*#warning Tell Cort to do the pgt cache for SMP*/ #define pgd_quicklist (quicklists.pgd_cache) #define pmd_quicklist ((unsigned long *)0) #define pte_quicklist (quicklists.pte_cache) #define pgtable_cache_size (quicklists.pgtable_cache_sz) -#endif +#else /* __SMP__ */ +#define pgd_quicklist (quicklists.pgd_cache) +#define pmd_quicklist ((unsigned long *)0) +#define pte_quicklist (quicklists.pte_cache) +#define pgtable_cache_size (quicklists.pgtable_cache_sz) +#endif /* __SMP__ */ +#define zero_quicklist (quicklists.zero_cache) +#define zero_cache_sz (quicklists.zero_sz) + +/* return a pre-zero'd page from the list, return NULL if none available -- Cort */ +extern unsigned long get_zero_page_fast(void); extern __inline__ pgd_t *get_pgd_slow(void) { - pgd_t *ret = (pgd_t *)__get_free_page(GFP_KERNEL), *init; + pgd_t *ret/* = (pgd_t *)__get_free_page(GFP_KERNEL)*/, *init; + if ( (ret = (pgd_t *)get_zero_page_fast()) == NULL ) + { + ret = (pgd_t *)__get_free_page(GFP_KERNEL); + memset (ret, 0, USER_PTRS_PER_PGD * sizeof(pgd_t)); + } if (ret) { init = pgd_offset(&init_mm, 0); - memset (ret, 0, USER_PTRS_PER_PGD * sizeof(pgd_t)); + /*memset (ret, 0, USER_PTRS_PER_PGD * sizeof(pgd_t));*/ memcpy (ret + USER_PTRS_PER_PGD, init + USER_PTRS_PER_PGD, (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t)); } @@ -441,7 +461,7 @@ extern __inline__ pte_t *get_pte_fast(void) pte_quicklist = (unsigned long *)(*ret); ret[0] = ret[1]; pgtable_cache_size--; - } + } return (pte_t *)ret; } @@ -513,6 +533,8 @@ extern inline pmd_t * pmd_alloc(pgd_t * pgd, unsigned long address) #define pmd_alloc_kernel pmd_alloc #define pte_alloc_kernel pte_alloc +extern int do_check_pgt_cache(int, int); + extern inline void set_pgdir(unsigned long address, pgd_t entry) { struct task_struct * p; @@ -588,7 +610,31 @@ extern void flush_hash_page(unsigned context, unsigned long va); #define module_map vmalloc #define module_unmap vfree -#define module_shrink vshrink + +/* CONFIG_APUS */ +/* For virtual address to physical address conversion */ +extern void cache_clear(__u32 addr, int length); +extern void cache_push(__u32 addr, int length); +extern int mm_end_of_chunk (unsigned long addr, int len); +extern unsigned long iopa(unsigned long addr); +extern unsigned long mm_ptov(unsigned long addr) __attribute__ ((const)); +#define VTOP(addr) (iopa((unsigned long)(addr))) +#define PTOV(addr) (mm_ptov((unsigned long)(addr))) + +/* Values for nocacheflag and cmode */ +/* These are not used by the APUS kernel_map, but prevents + compilation errors. */ +#define KERNELMAP_FULL_CACHING 0 +#define KERNELMAP_NOCACHE_SER 1 +#define KERNELMAP_NOCACHE_NONSER 2 +#define KERNELMAP_NO_COPYBACK 3 + +/* + * Map some physical address range into the kernel address space. + */ +extern unsigned long kernel_map(unsigned long paddr, unsigned long size, + int nocacheflag, unsigned long *memavailp ); + /* Needs to be defined here and not in linux/mm.h, as it is arch dependent */ #define PageSkip(page) (0) diff --git a/include/asm-ppc/pmu.h b/include/asm-ppc/pmu.h index 2a2fb1b61..672aeed2e 100644 --- a/include/asm-ppc/pmu.h +++ b/include/asm-ppc/pmu.h @@ -16,12 +16,18 @@ #define PMU_READ_NVRAM 0x3b /* read non-volatile RAM */ #define PMU_SET_RTC 0x30 /* set real-time clock */ #define PMU_READ_RTC 0x38 /* read real-time clock */ +#define PMU_SET_VOLBUTTON 0x40 /* set volume up/down position */ #define PMU_BACKLIGHT_BRIGHT 0x41 /* set backlight brightness */ +#define PMU_GET_VOLBUTTON 0x48 /* get volume up/down position */ +#define PMU_PCEJECT 0x4c /* eject PC-card from slot */ +#define PMU_BATTERY_STATE 0x6b /* report battery state etc. */ #define PMU_SET_INTR_MASK 0x70 /* set PMU interrupt mask */ #define PMU_INT_ACK 0x78 /* read interrupt bits */ #define PMU_SHUTDOWN 0x7e /* turn power off */ #define PMU_SLEEP 0x7f /* put CPU to sleep */ #define PMU_RESET 0xd0 /* reset CPU */ +#define PMU_GET_BRIGHTBUTTON 0xd9 /* report brightness up/down pos */ +#define PMU_GET_COVER 0xdc /* report cover open/closed */ /* Bits in PMU interrupt and interrupt mask bytes */ #define PMU_INT_ADB_AUTO 0x04 /* ADB autopoll, when PMU_INT_ADB */ @@ -30,7 +36,16 @@ #define PMU_INT_ADB 0x10 /* ADB autopoll or reply data */ #define PMU_INT_TICK 0x80 /* 1-second tick interrupt */ + +/* + * Ioctl commands for the /dev/pmu device + */ +#include <linux/ioctl.h> + +#define PMU_IOC_SLEEP _IO('B', 0) + #ifdef __KERNEL__ +void find_via_pmu(void); void via_pmu_init(void); int pmu_request(struct adb_request *req, void (*done)(struct adb_request *), int nbytes, ...); @@ -39,4 +54,15 @@ void pmu_poll(void); void pmu_enable_backlight(int on); +/* + * Stuff for putting the powerbook to sleep and waking it again. + */ +#include <linux/notifier.h> + +extern struct notifier_block *sleep_notifier_list; + +/* code values for calling sleep/wakeup handlers */ +#define PBOOK_SLEEP 1 +#define PBOOK_WAKE 2 + #endif /* __KERNEL */ diff --git a/include/asm-ppc/posix_types.h b/include/asm-ppc/posix_types.h index e659279ff..479a9e8e8 100644 --- a/include/asm-ppc/posix_types.h +++ b/include/asm-ppc/posix_types.h @@ -43,6 +43,7 @@ typedef struct { #else /* __GNUC__ */ +#if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) /* With GNU C, use inline functions instead so args are evaluated only once: */ #undef __FD_SET @@ -95,6 +96,6 @@ static __inline__ void __FD_ZERO(__kernel_fd_set *p) } } +#endif /* defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) */ #endif /* __GNUC__ */ - #endif /* _PPC_POSIX_TYPES_H */ diff --git a/include/asm-ppc/processor.h b/include/asm-ppc/processor.h index 130b5c8b0..cfa71b568 100644 --- a/include/asm-ppc/processor.h +++ b/include/asm-ppc/processor.h @@ -71,6 +71,10 @@ #define _PREP_IBM 0x00 /* ibm prep */ #define _PREP_Bull 0x03 /* bull prep */ +/* these are arbitrary */ +#define _CHRP_Motorola 0x04 /* motorola chrp, the cobra */ +#define _CHRP_IBM 0x05 /* IBM chrp, the longtrail and longtrail 2 */ + #define _GLOBAL(n)\ .globl n;\ n: @@ -192,6 +196,8 @@ n: #ifdef CONFIG_APUS #define _machine (_MACH_apus) #define is_prep (0) +#define is_chrp (0) +#define have_of (0) #endif /* CONFIG_APUS */ #else /* CONFIG_MACH_SPECIFIC */ @@ -223,6 +229,9 @@ void release_thread(struct task_struct *); #define MCA_bus 0 #define MCA_bus__is_a_macro /* for versions in ksyms.c */ +/* Lazy FPU handling on uni-processor */ +extern struct task_struct *last_task_used_math; + /* * this is the minimum allowable io space due to the location * of the io areas on prep (first one at 0x80000000) but @@ -234,12 +243,7 @@ void release_thread(struct task_struct *); /* This decides where the kernel will search for a free chunk of vm * space during mmap's. */ -#define TASK_UNMAPPED_BASE (TASK_SIZE / 8 * 3) - -#define COPY_TASK_STRUCT(dst, src) \ -do { \ - *dst = *src; \ -} while (0) +#define TASK_UNMAPPED_BASE (TASK_SIZE / 8 * 3) typedef struct { unsigned long seg; @@ -285,6 +289,9 @@ static inline unsigned long thread_saved_pc(struct thread_struct *t) return (t->regs) ? t->regs->nip : 0; } +#define copy_segments(nr, tsk, mm) do { } while (0) +#define release_segments(mm) do { } while (0) + /* * NOTE! The task struct and the stack go together */ diff --git a/include/asm-ppc/residual.h b/include/asm-ppc/residual.h index 428dd22f7..c037a4e4a 100644 --- a/include/asm-ppc/residual.h +++ b/include/asm-ppc/residual.h @@ -314,8 +314,19 @@ typedef struct _RESIDUAL { } RESIDUAL; -extern RESIDUAL res; -void print_residual_device_info(void); +extern RESIDUAL *res; +extern void print_residual_device_info(void); +extern PPC_DEVICE *residual_find_device(unsigned long BusMask, + unsigned char * DevID, int BaseType, + int SubType, int Interface, int n); +extern PnP_TAG_PACKET *PnP_find_packet(unsigned char *p, unsigned packet_tag, + int n); +extern PnP_TAG_PACKET *PnP_find_small_vendor_packet(unsigned char *p, + unsigned packet_type, + int n); +extern PnP_TAG_PACKET *PnP_find_large_vendor_packet(unsigned char *p, + unsigned packet_type, + int n); #endif /* __ASSEMBLY__ */ #endif /* ndef _RESIDUAL_ */ diff --git a/include/asm-ppc/serial.h b/include/asm-ppc/serial.h new file mode 100644 index 000000000..ff42aa817 --- /dev/null +++ b/include/asm-ppc/serial.h @@ -0,0 +1,123 @@ +/* + * include/asm-ppc/serial.h + */ + +#include <linux/config.h> + +#ifdef CONFIG_APUS +#include <asm-m68k/serial.h> +#else + +/* + * This assumes you have a 1.8432 MHz clock for your UART. + * + * It'd be nice if someone built a serial card with a 24.576 MHz + * clock, since the 16550A is capable of handling a top speed of 1.5 + * megabits/second; but this requires the faster clock. + */ +#define BASE_BAUD ( 1843200 / 16 ) + +/* Standard COM flags (except for COM4, because of the 8514 problem) */ +#ifdef CONFIG_SERIAL_DETECT_IRQ +#define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ) +#define STD_COM4_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_AUTO_IRQ) +#else +#define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST) +#define STD_COM4_FLAGS ASYNC_BOOT_AUTOCONF +#endif + +#ifdef CONFIG_SERIAL_MANY_PORTS +#define FOURPORT_FLAGS ASYNC_FOURPORT +#define ACCENT_FLAGS 0 +#define BOCA_FLAGS 0 +#define HUB6_FLAGS 0 +#endif + +/* + * The following define the access methods for the HUB6 card. All + * access is through two ports for all 24 possible chips. The card is + * selected through the high 2 bits, the port on that card with the + * "middle" 3 bits, and the register on that port with the bottom + * 3 bits. + * + * While the access port and interrupt is configurable, the default + * port locations are 0x302 for the port control register, and 0x303 + * for the data read/write register. Normally, the interrupt is at irq3 + * but can be anything from 3 to 7 inclusive. Note that using 3 will + * require disabling com2. + */ + +#define C_P(card,port) (((card)<<6|(port)<<3) + 1) + +#define STD_SERIAL_PORT_DEFNS \ + /* UART CLK PORT IRQ FLAGS */ \ + { 0, BASE_BAUD, 0x3F8, 4, STD_COM_FLAGS }, /* ttyS0 */ \ + { 0, BASE_BAUD, 0x2F8, 3, STD_COM_FLAGS }, /* ttyS1 */ \ + { 0, BASE_BAUD, 0x3E8, 4, STD_COM_FLAGS }, /* ttyS2 */ \ + { 0, BASE_BAUD, 0x2E8, 3, STD_COM4_FLAGS }, /* ttyS3 */ + + +#ifdef CONFIG_SERIAL_MANY_PORTS +#define EXTRA_SERIAL_PORT_DEFNS \ + { 0, BASE_BAUD, 0x1A0, 9, FOURPORT_FLAGS }, /* ttyS4 */ \ + { 0, BASE_BAUD, 0x1A8, 9, FOURPORT_FLAGS }, /* ttyS5 */ \ + { 0, BASE_BAUD, 0x1B0, 9, FOURPORT_FLAGS }, /* ttyS6 */ \ + { 0, BASE_BAUD, 0x1B8, 9, FOURPORT_FLAGS }, /* ttyS7 */ \ + { 0, BASE_BAUD, 0x2A0, 5, FOURPORT_FLAGS }, /* ttyS8 */ \ + { 0, BASE_BAUD, 0x2A8, 5, FOURPORT_FLAGS }, /* ttyS9 */ \ + { 0, BASE_BAUD, 0x2B0, 5, FOURPORT_FLAGS }, /* ttyS10 */ \ + { 0, BASE_BAUD, 0x2B8, 5, FOURPORT_FLAGS }, /* ttyS11 */ \ + { 0, BASE_BAUD, 0x330, 4, ACCENT_FLAGS }, /* ttyS12 */ \ + { 0, BASE_BAUD, 0x338, 4, ACCENT_FLAGS }, /* ttyS13 */ \ + { 0, BASE_BAUD, 0x000, 0, 0 }, /* ttyS14 (spare) */ \ + { 0, BASE_BAUD, 0x000, 0, 0 }, /* ttyS15 (spare) */ \ + { 0, BASE_BAUD, 0x100, 12, BOCA_FLAGS }, /* ttyS16 */ \ + { 0, BASE_BAUD, 0x108, 12, BOCA_FLAGS }, /* ttyS17 */ \ + { 0, BASE_BAUD, 0x110, 12, BOCA_FLAGS }, /* ttyS18 */ \ + { 0, BASE_BAUD, 0x118, 12, BOCA_FLAGS }, /* ttyS19 */ \ + { 0, BASE_BAUD, 0x120, 12, BOCA_FLAGS }, /* ttyS20 */ \ + { 0, BASE_BAUD, 0x128, 12, BOCA_FLAGS }, /* ttyS21 */ \ + { 0, BASE_BAUD, 0x130, 12, BOCA_FLAGS }, /* ttyS22 */ \ + { 0, BASE_BAUD, 0x138, 12, BOCA_FLAGS }, /* ttyS23 */ \ + { 0, BASE_BAUD, 0x140, 12, BOCA_FLAGS }, /* ttyS24 */ \ + { 0, BASE_BAUD, 0x148, 12, BOCA_FLAGS }, /* ttyS25 */ \ + { 0, BASE_BAUD, 0x150, 12, BOCA_FLAGS }, /* ttyS26 */ \ + { 0, BASE_BAUD, 0x158, 12, BOCA_FLAGS }, /* ttyS27 */ \ + { 0, BASE_BAUD, 0x160, 12, BOCA_FLAGS }, /* ttyS28 */ \ + { 0, BASE_BAUD, 0x168, 12, BOCA_FLAGS }, /* ttyS29 */ \ + { 0, BASE_BAUD, 0x170, 12, BOCA_FLAGS }, /* ttyS30 */ \ + { 0, BASE_BAUD, 0x178, 12, BOCA_FLAGS }, /* ttyS31 */ +#else +#define EXTRA_SERIAL_PORT_DEFNS +#endif + +/* You can have up to four HUB6's in the system, but I've only + * included two cards here for a total of twelve ports. + */ +#if (defined(CONFIG_HUB6) && defined(CONFIG_SERIAL_MANY_PORTS)) +#define HUB6_SERIAL_PORT_DFNS \ + { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(0,0) }, /* ttyS32 */ \ + { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(0,1) }, /* ttyS33 */ \ + { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(0,2) }, /* ttyS34 */ \ + { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(0,3) }, /* ttyS35 */ \ + { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(0,4) }, /* ttyS36 */ \ + { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(0,5) }, /* ttyS37 */ \ + { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(1,0) }, /* ttyS38 */ \ + { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(1,1) }, /* ttyS39 */ \ + { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(1,2) }, /* ttyS40 */ \ + { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(1,3) }, /* ttyS41 */ \ + { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(1,4) }, /* ttyS42 */ \ + { 0, BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(1,5) }, /* ttyS43 */ +#else +#define HUB6_SERIAL_PORT_DFNS +#endif + +#define MCA_SERIAL_PORT_DFNS + +#define SERIAL_PORT_DFNS \ + STD_SERIAL_PORT_DEFNS \ + EXTRA_SERIAL_PORT_DEFNS \ + HUB6_SERIAL_PORT_DFNS \ + MCA_SERIAL_PORT_DFNS + +#endif /* CONFIG_APUS */ diff --git a/include/asm-ppc/setup.h b/include/asm-ppc/setup.h new file mode 100644 index 000000000..2f9164160 --- /dev/null +++ b/include/asm-ppc/setup.h @@ -0,0 +1,9 @@ +#ifndef _PPC_SETUP_H +#define _PPC_SETUP_H + +#define m68k_num_memory num_memory +#define m68k_memory memory + +#include <asm-m68k/setup.h> + +#endif /* _PPC_SETUP_H */ diff --git a/include/asm-ppc/siginfo.h b/include/asm-ppc/siginfo.h index ff491fb3d..0ead0b84e 100644 --- a/include/asm-ppc/siginfo.h +++ b/include/asm-ppc/siginfo.h @@ -43,6 +43,7 @@ typedef struct siginfo { /* SIGCHLD */ struct { pid_t _pid; /* which child */ + uid_t _uid; /* sender's uid */ int _status; /* exit code */ clock_t _utime; clock_t _stime; diff --git a/include/asm-ppc/signal.h b/include/asm-ppc/signal.h index d0c532878..7e14071d9 100644 --- a/include/asm-ppc/signal.h +++ b/include/asm-ppc/signal.h @@ -88,6 +88,14 @@ typedef struct { #define SA_RESTORER 0x04000000 +/* + * sigaltstack controls + */ +#define SS_ONSTACK 1 +#define SS_DISABLE 2 + +#define MINSIGSTKSZ 2048 +#define SIGSTKSZ 8192 #ifdef __KERNEL__ /* diff --git a/include/asm-ppc/smp_lock.h b/include/asm-ppc/smp_lock.h deleted file mode 100644 index 1db50d5ef..000000000 --- a/include/asm-ppc/smp_lock.h +++ /dev/null @@ -1,49 +0,0 @@ -#ifndef __PPC_SMPLOCK_H -#define __PPC_SMPLOCK_H - -#ifndef __SMP__ - -#define lock_kernel() do { } while (0) -#define unlock_kernel() do { } while (0) -#define release_kernel_lock(task, cpu, depth) ((depth) = 1) -#define reacquire_kernel_lock(task, cpu, depth) do { } while(0) - -#else /* __SMP__ */ - -/* Release global kernel lock and global interrupt lock */ -#define release_kernel_lock(task, cpu, depth) \ -do { \ - if((depth = (task)->lock_depth) != 0) { \ - __cli(); \ - (task)->lock_depth = 0; \ - klock_info.akp = NO_PROC_ID; \ - klock_info.kernel_flag = 0; \ - } \ - release_irqlock(cpu); \ - __sti(); \ -} while(0) - -extern void reacquire_kernel_lock(struct task_struct *, int,int); - -/* The following acquire and release the master kernel global lock, - * the idea is that the usage of this mechanmism becomes less and less - * as time goes on, to the point where they are no longer needed at all - * and can thus disappear. - */ -extern void __lock_kernel(struct task_struct *); -extern void __unlock_kernel(struct task_struct *); - -extern __inline__ void lock_kernel(void) -{ - __lock_kernel(current); -} - -/* Release kernel global lock. */ -extern __inline__ void unlock_kernel(void) -{ - __unlock_kernel(current); -} - - -#endif /* __SMP__ */ -#endif /* __PPC_SMPLOCK_H */ diff --git a/include/asm-ppc/smplock.h b/include/asm-ppc/smplock.h new file mode 100644 index 000000000..e62326a10 --- /dev/null +++ b/include/asm-ppc/smplock.h @@ -0,0 +1,49 @@ +/* + * <asm/smplock.h> + * + * Default SMP lock implementation + */ +#include <linux/interrupt.h> +#include <asm/spinlock.h> + +extern spinlock_t kernel_flag; + +/* + * Release global kernel lock and global interrupt lock + */ +#define release_kernel_lock(task, cpu) \ +do { \ + if (task->lock_depth >= 0) \ + spin_unlock(&kernel_flag); \ + release_irqlock(cpu); \ + __sti(); \ +} while (0) + +/* + * Re-acquire the kernel lock + */ +#define reacquire_kernel_lock(task) \ +do { \ + if (task->lock_depth >= 0) \ + spin_lock(&kernel_flag); \ +} while (0) + + +/* + * Getting the big kernel lock. + * + * This cannot happen asynchronously, + * so we only need to worry about other + * CPU's. + */ +extern __inline__ void lock_kernel(void) +{ + if (!++current->lock_depth) + spin_lock(&kernel_flag); +} + +extern __inline__ void unlock_kernel(void) +{ + if (--current->lock_depth < 0) + spin_unlock(&kernel_flag); +} diff --git a/include/asm-ppc/softirq.h b/include/asm-ppc/softirq.h index 99506983d..712616bd1 100644 --- a/include/asm-ppc/softirq.h +++ b/include/asm-ppc/softirq.h @@ -19,6 +19,8 @@ extern int __ppc_bh_counter; +#define synchronize_bh() do { } while (0) + #define clear_active_bhs(x) atomic_clear_mask((x),&bh_active) extern inline void init_bh(int nr, void (*routine)(void)) @@ -81,6 +83,8 @@ extern atomic_t __ppc_bh_counter; #define end_bh_atomic() atomic_dec(&__ppc_bh_counter) +#define synchronize_bh() do { } while (0) /* XXX implement SMP version --Cort */ + #include <asm/spinlock.h> extern spinlock_t global_bh_lock; diff --git a/include/asm-ppc/spinlock.h b/include/asm-ppc/spinlock.h index 00f1de281..55e6bd16f 100644 --- a/include/asm-ppc/spinlock.h +++ b/include/asm-ppc/spinlock.h @@ -64,8 +64,7 @@ typedef struct { } spinlock_t; #define SPIN_LOCK_UNLOCKED { 0, 0, 0 } -#define spin_lock_init(lp) \ -do { spinlock_t *p = (lp); p->owner_pc = p->owner_cpu = p->lock = 0; } while(0) +#define spin_lock_init(lp) do { (lp)->lock = 0; } while(0) #define spin_unlock_wait(lp) do { barrier(); } while((lp)->lock) extern void _spin_lock(spinlock_t *lock); diff --git a/include/asm-ppc/stat.h b/include/asm-ppc/stat.h index 7b1028c39..d6d868312 100644 --- a/include/asm-ppc/stat.h +++ b/include/asm-ppc/stat.h @@ -37,40 +37,4 @@ struct stat { unsigned long __unused5; }; -typedef struct { - unsigned int major; - unsigned int minor; -} __new_dev_t; - -struct stat64 { - __new_dev_t st_dev; - __u64 st_ino; - unsigned int st_mode; - unsigned int st_nlink; - unsigned int st_uid; - unsigned int st_gid; - __new_dev_t st_rdev; - __s64 st_size; - __u64 st_blocks; - unsigned long st_atime; - unsigned long __unused1; - unsigned long st_mtime; - unsigned long __unused2; - unsigned long st_ctime; - unsigned long __unused3; - unsigned long st_blksize; - unsigned long __unused4; -}; - -#define __XSTAT_VER_1 1 -#define __XSTAT_VER_2 2 -#define __XSTAT_VER_MASK 0xff - -#define __XSTAT_VER_XSTAT 0x000 -#define __XSTAT_VER_LXSTAT 0x100 -#define __XSTAT_VER_FXSTAT 0x200 -#define __XSTAT_VER_TYPEMASK 0xff00 - -#define __XMKNOD_VER_1 1 - #endif diff --git a/include/asm-ppc/system.h b/include/asm-ppc/system.h index f0c016235..978fb2ab8 100644 --- a/include/asm-ppc/system.h +++ b/include/asm-ppc/system.h @@ -3,6 +3,7 @@ #include <linux/kdev_t.h> #include <asm/processor.h> +#include <asm/atomic.h> #define mb() __asm__ __volatile__ ("sync" : : : "memory") @@ -28,10 +29,10 @@ extern __inline__ void dcbi(void *line) extern __inline__ void __restore_flags(unsigned long flags) { - extern unsigned lost_interrupts; + extern atomic_t n_lost_interrupts; extern void do_lost_interrupts(unsigned long); - if ((flags & MSR_EE) && lost_interrupts != 0) { + if ((flags & MSR_EE) && atomic_read(&n_lost_interrupts) != 0) { do_lost_interrupts(flags); } else { __asm__ __volatile__ ("sync; mtmsr %0; isync" @@ -40,28 +41,6 @@ extern __inline__ void __restore_flags(unsigned long flags) } -#if 0 -/* - * Gcc bug prevents us from using this inline func so for now - * it lives in misc.S - */ -void __inline__ __restore_flags(unsigned long flags) -{ - extern unsigned lost_interrupts; - __asm__ __volatile__ ( - "andi. 0,%0,%2 \n\t" - "beq 2f \n\t" - "cmpi 0,%1,0 \n\t" - "bne do_lost_interrupts \n\t" - "2: sync \n\t" - "mtmsr %0 \n\t" - "isync \n\t" - : - : "r" (flags), "r"(lost_interrupts), "i" (1<<15)/*MSR_EE*/ - : "0", "cc"); -} -#endif - extern void __sti(void); extern void __cli(void); extern int _disable_interrupts(void); diff --git a/include/asm-ppc/timex.h b/include/asm-ppc/timex.h new file mode 100644 index 000000000..a20f6031c --- /dev/null +++ b/include/asm-ppc/timex.h @@ -0,0 +1,15 @@ +/* + * linux/include/asm-ppc/timex.h + * + * ppc architecture timex specifications + */ +#ifndef _ASMppc_TIMEX_H +#define _ASMppc_TIMEX_H + +#define CLOCK_TICK_RATE 1193180 /* Underlying HZ */ +#define CLOCK_TICK_FACTOR 20 /* Factor of both 1000000 and CLOCK_TICK_RATE */ +#define FINETUNE ((((((long)LATCH * HZ - CLOCK_TICK_RATE) << SHIFT_HZ) * \ + (1000000/CLOCK_TICK_FACTOR) / (CLOCK_TICK_RATE/CLOCK_TICK_FACTOR)) \ + << (SHIFT_SCALE-SHIFT_HZ)) / HZ) + +#endif diff --git a/include/asm-ppc/traps.h b/include/asm-ppc/traps.h new file mode 100644 index 000000000..68e7326b5 --- /dev/null +++ b/include/asm-ppc/traps.h @@ -0,0 +1 @@ +#include <asm-m68k/traps.h> diff --git a/include/asm-ppc/unistd.h b/include/asm-ppc/unistd.h index 8202dde4e..2a0f9f16b 100644 --- a/include/asm-ppc/unistd.h +++ b/include/asm-ppc/unistd.h @@ -21,7 +21,7 @@ #define __NR_time 13 #define __NR_mknod 14 #define __NR_chmod 15 -#define __NR_chown 16 +#define __NR_lchown 16 #define __NR_break 17 #define __NR_oldstat 18 #define __NR_lseek 19 @@ -177,39 +177,189 @@ #define __NR_setresgid 169 #define __NR_getresgid 170 #define __NR_prctl 171 -#define __NR_xstat 172 -#define __NR_xmknod 173 +#define __NR_rt_sigreturn 172 +#define __NR_rt_sigaction 173 +#define __NR_rt_sigprocmask 174 +#define __NR_rt_sigpending 175 +#define __NR_rt_sigtimedwait 176 +#define __NR_rt_sigqueueinfo 177 +#define __NR_rt_sigsuspend 178 +#define __NR_pread 179 +#define __NR_pwrite 180 +#define __NR_chown 181 +#define __NR_getcwd 182 #define __NR(n) #n -#define __do_syscall(n) \ - asm volatile ("li 0,%0\n\ - sc\n\ - bns 1f\n\ - mr 0,3\n\ - lis 3,errno@ha\n\ - stw 0,errno@l(3)\n\ - li 3,-1\n\ -1:" : : "i" (n) : "r0", "r3") -#define _syscall0(type,name) \ -type name(void) \ -{ __do_syscall(__NR_##name); } -#define _syscall1(type,name,type1,arg1) \ -type name(type1 arg1) \ -{ __do_syscall(__NR_##name); } -#define _syscall2(type,name,type1,arg1,type2,arg2) \ -type name(type1 arg1,type2 arg2) \ -{ __do_syscall(__NR_##name); } -#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \ -type name(type1 arg1,type2 arg2,type3 arg3) \ -{ __do_syscall(__NR_##name); } + +#define __syscall_return(type) \ + return (__sc_err & 0x10000000 ? errno = __sc_ret, __sc_ret = -1 : 0), \ + (type) __sc_ret + +#define __syscall_clobbers \ + "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" + +#define _syscall0(type,name) \ +type name(void) \ +{ \ + unsigned long __sc_ret, __sc_err; \ + { \ + register unsigned long __sc_0 __asm__ ("r0"); \ + register unsigned long __sc_3 __asm__ ("r3"); \ + \ + __sc_0 = __NR_##name; \ + __asm__ __volatile__ \ + ("sc \n\t" \ + "mfcr %1 " \ + : "=&r" (__sc_3), "=&r" (__sc_0) \ + : "0" (__sc_3), "1" (__sc_0) \ + : __syscall_clobbers); \ + __sc_ret = __sc_3; \ + __sc_err = __sc_0; \ + } \ + __syscall_return (type); \ +} + +#define _syscall1(type,name,type1,arg1) \ +type name(type1 arg1) \ +{ \ + unsigned long __sc_ret, __sc_err; \ + { \ + register unsigned long __sc_0 __asm__ ("r0"); \ + register unsigned long __sc_3 __asm__ ("r3"); \ + \ + __sc_3 = (unsigned long) (arg1); \ + __sc_0 = __NR_##name; \ + __asm__ __volatile__ \ + ("sc \n\t" \ + "mfcr %1 " \ + : "=&r" (__sc_3), "=&r" (__sc_0) \ + : "0" (__sc_3), "1" (__sc_0) \ + : __syscall_clobbers); \ + __sc_ret = __sc_3; \ + __sc_err = __sc_0; \ + } \ + __syscall_return (type); \ +} + +#define _syscall2(type,name,type1,arg1,type2,arg2) \ +type name(type1 arg1, type2 arg2) \ +{ \ + unsigned long __sc_ret, __sc_err; \ + { \ + register unsigned long __sc_0 __asm__ ("r0"); \ + register unsigned long __sc_3 __asm__ ("r3"); \ + register unsigned long __sc_4 __asm__ ("r4"); \ + \ + __sc_3 = (unsigned long) (arg1); \ + __sc_4 = (unsigned long) (arg2); \ + __sc_0 = __NR_##name; \ + __asm__ __volatile__ \ + ("sc \n\t" \ + "mfcr %1 " \ + : "=&r" (__sc_3), "=&r" (__sc_0) \ + : "0" (__sc_3), "1" (__sc_0), \ + "r" (__sc_4) \ + : __syscall_clobbers); \ + __sc_ret = __sc_3; \ + __sc_err = __sc_0; \ + } \ + __syscall_return (type); \ +} + +#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \ +type name(type1 arg1, type2 arg2, type3 arg3) \ +{ \ + unsigned long __sc_ret, __sc_err; \ + { \ + register unsigned long __sc_0 __asm__ ("r0"); \ + register unsigned long __sc_3 __asm__ ("r3"); \ + register unsigned long __sc_4 __asm__ ("r4"); \ + register unsigned long __sc_5 __asm__ ("r5"); \ + \ + __sc_3 = (unsigned long) (arg1); \ + __sc_4 = (unsigned long) (arg2); \ + __sc_5 = (unsigned long) (arg3); \ + __sc_0 = __NR_##name; \ + __asm__ __volatile__ \ + ("sc \n\t" \ + "mfcr %1 " \ + : "=&r" (__sc_3), "=&r" (__sc_0) \ + : "0" (__sc_3), "1" (__sc_0), \ + "r" (__sc_4), \ + "r" (__sc_5) \ + : __syscall_clobbers); \ + __sc_ret = __sc_3; \ + __sc_err = __sc_0; \ + } \ + __syscall_return (type); \ +} + #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \ -type name (type1 arg1, type2 arg2, type3 arg3, type4 arg4) \ -{ __do_syscall(__NR_##name); } -#define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ - type5,arg5) \ -type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5) \ -{ __do_syscall(__NR_##name); } +type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4) \ +{ \ + unsigned long __sc_ret, __sc_err; \ + { \ + register unsigned long __sc_0 __asm__ ("r0"); \ + register unsigned long __sc_3 __asm__ ("r3"); \ + register unsigned long __sc_4 __asm__ ("r4"); \ + register unsigned long __sc_5 __asm__ ("r5"); \ + register unsigned long __sc_6 __asm__ ("r6"); \ + \ + __sc_3 = (unsigned long) (arg1); \ + __sc_4 = (unsigned long) (arg2); \ + __sc_5 = (unsigned long) (arg3); \ + __sc_6 = (unsigned long) (arg4); \ + __sc_0 = __NR_##name; \ + __asm__ __volatile__ \ + ("sc \n\t" \ + "mfcr %1 " \ + : "=&r" (__sc_3), "=&r" (__sc_0) \ + : "0" (__sc_3), "1" (__sc_0), \ + "r" (__sc_4), \ + "r" (__sc_5), \ + "r" (__sc_6) \ + : __syscall_clobbers); \ + __sc_ret = __sc_3; \ + __sc_err = __sc_0; \ + } \ + __syscall_return (type); \ +} + +#define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5) \ +type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) \ +{ \ + unsigned long __sc_ret, __sc_err; \ + { \ + register unsigned long __sc_0 __asm__ ("r0"); \ + register unsigned long __sc_3 __asm__ ("r3"); \ + register unsigned long __sc_4 __asm__ ("r4"); \ + register unsigned long __sc_5 __asm__ ("r5"); \ + register unsigned long __sc_6 __asm__ ("r6"); \ + register unsigned long __sc_7 __asm__ ("r7"); \ + \ + __sc_3 = (unsigned long) (arg1); \ + __sc_4 = (unsigned long) (arg2); \ + __sc_5 = (unsigned long) (arg3); \ + __sc_6 = (unsigned long) (arg4); \ + __sc_7 = (unsigned long) (arg5); \ + __sc_0 = __NR_##name; \ + __asm__ __volatile__ \ + ("sc \n\t" \ + "mfcr %1 " \ + : "=&r" (__sc_3), "=&r" (__sc_0) \ + : "0" (__sc_3), "1" (__sc_0), \ + "r" (__sc_4), \ + "r" (__sc_5), \ + "r" (__sc_6), \ + "r" (__sc_7) \ + : __syscall_clobbers); \ + __sc_ret = __sc_3; \ + __sc_err = __sc_0; \ + } \ + __syscall_return (type); \ +} + #ifdef __KERNEL_SYSCALLS__ @@ -234,19 +384,22 @@ static inline long kernel_thread(int (*fn)(void *), void * arg, unsigned long fl /* * System call prototypes. */ -int idle(void); -int setup(int); -int sync(void); -pid_t setsid(void); -int write(int, const char *, off_t); -int dup(int); -int execve(const char *, char **, char **); -int open(const char *, int, int); -int close(int); -pid_t waitpid(pid_t, int *, int); -pid_t fork(void); -void _exit(int); -int delete_module(const char *); +#define __NR__exit __NR_exit +static inline _syscall0(int,idle) +static inline _syscall0(int,pause) +static inline _syscall1(int,setup,int,magic) +static inline _syscall0(int,sync) +static inline _syscall0(pid_t,setsid) +static inline _syscall3(int,write,int,fd,const char *,buf,off_t,count) +static inline _syscall3(int,read,int,fd,char *,buf,off_t,count) +static inline _syscall3(off_t,lseek,int,fd,off_t,offset,int,count) +static inline _syscall1(int,dup,int,fd) +static inline _syscall3(int,execve,const char *,file,char **,argv,char **,envp) +static inline _syscall3(int,open,const char *,file,int,flag,int,mode) +static inline _syscall1(int,close,int,fd) +static inline _syscall1(int,_exit,int,exitcode) +static inline _syscall3(pid_t,waitpid,pid_t,pid,int *,wait_stat,int,options) +static inline _syscall1(int,delete_module,const char *,name) static inline pid_t wait(int * wait_stat) { diff --git a/include/asm-ppc/vc_ioctl.h b/include/asm-ppc/vc_ioctl.h new file mode 100644 index 000000000..3d8b884b9 --- /dev/null +++ b/include/asm-ppc/vc_ioctl.h @@ -0,0 +1,43 @@ +#ifndef _LINUX_VC_IOCTL_H +#define _LINUX_VC_IOCTL_H + +struct vc_mode { + int height; + int width; + int depth; + int pitch; + int mode; + char name[32]; + unsigned long fb_address; + unsigned long cmap_adr_address; + unsigned long cmap_data_address; + unsigned long disp_reg_address; +}; + +#define VC_GETMODE 0x7667 +#define VC_SETMODE 0x7668 +#define VC_INQMODE 0x7669 + +#define VC_SETCMAP 0x766a +#define VC_GETCMAP 0x766b + +#define VC_POWERMODE 0x766c + +/* Values for the argument to the VC_POWERMODE ioctl */ +#define VC_POWERMODE_INQUIRY (-1) +#define VESA_NO_BLANKING 0 +#define VESA_VSYNC_SUSPEND 1 +#define VESA_HSYNC_SUSPEND 2 +#define VESA_POWERDOWN 3 + +#ifdef __KERNEL__ +extern int console_getmode(struct vc_mode *); +extern int console_setmode(struct vc_mode *, int); +extern int console_setcmap(int, unsigned char *, unsigned char *, + unsigned char *); +extern int console_powermode(int); +extern struct vc_mode display_info; +extern struct fb_info *console_fb_info; +#endif + +#endif /* _LINUX_VC_IOCTL_H */ diff --git a/include/asm-ppc/vga.h b/include/asm-ppc/vga.h new file mode 100644 index 000000000..d82388831 --- /dev/null +++ b/include/asm-ppc/vga.h @@ -0,0 +1,29 @@ +/* + * Access to VGA videoram + * + * (c) 1998 Martin Mares <mj@ucw.cz> + */ + +#ifndef _LINUX_ASM_VGA_H_ +#define _LINUX_ASM_VGA_H_ + +#include <asm/io.h> + +#define VT_BUF_HAVE_RW + +extern inline void scr_writew(u16 val, u16 *addr) +{ + st_le16(addr, val); +} + +extern inline u16 scr_readw(u16 *addr) +{ + return ld_le16(addr); +} + +#define VGA_MAP_MEM(x) (x + _ISA_MEM_BASE) + +#define vga_readb(x) (*(x)) +#define vga_writeb(x,y) (*(y) = (x)) + +#endif diff --git a/include/asm-ppc/xstat.h b/include/asm-ppc/xstat.h deleted file mode 100644 index f489523b7..000000000 --- a/include/asm-ppc/xstat.h +++ /dev/null @@ -1,35 +0,0 @@ -/* $Id: xstat.h,v 1.1 1998/02/06 12:51:55 jj Exp $ - * xstat.h: sys_xstat/xmknod architecture dependent stuff. - * - * Copyright (C) 1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) - */ - -extern __inline__ int cp_xstat(struct inode *inode, struct stat64 *s, unsigned long blocks, int blksize) -{ - struct stat64 tmp; - - memset (&tmp, 0, sizeof(tmp)); - tmp.st_dev.major = MAJOR(inode->i_dev); - tmp.st_dev.minor = MINOR(inode->i_dev); - tmp.st_ino = inode->i_ino; - tmp.st_mode = inode->i_mode; - tmp.st_nlink = inode->i_nlink; - tmp.st_uid = inode->i_uid; - tmp.st_gid = inode->i_gid; - tmp.st_rdev.major = MAJOR(inode->i_rdev); - tmp.st_rdev.minor = MINOR(inode->i_rdev); - tmp.st_size = inode->i_size; - tmp.st_blksize = blksize; - tmp.st_blocks = blocks; - tmp.st_atime = inode->i_atime; - tmp.st_mtime = inode->i_mtime; - tmp.st_ctime = inode->i_ctime; - return copy_to_user(s,&tmp,sizeof(tmp)); -} - -extern __inline__ int get_user_new_dev_t(kdev_t *kdev, __new_dev_t *udev) { - __new_dev_t ndev; - if (copy_from_user (&ndev, udev, sizeof(__new_dev_t))) return -EFAULT; - *kdev = MKDEV(ndev.major, ndev.minor); - return 0; -} diff --git a/include/asm-sparc/ap1000/pgtapmmu.h b/include/asm-sparc/ap1000/pgtapmmu.h index 8a46b1df0..9e238db45 100644 --- a/include/asm-sparc/ap1000/pgtapmmu.h +++ b/include/asm-sparc/ap1000/pgtapmmu.h @@ -38,6 +38,7 @@ #define APMMU_PGD_TABLE_SIZE 0x400 /* 256 entries, 4 bytes a piece */ #define APMMU_VMALLOC_START (0xfe300000) +#define APMMU_VMALLOC_END ~0x0UL /* Definition of the values in the ET field of PTD's and PTE's */ #define APMMU_ET_MASK 0x3 diff --git a/include/asm-sparc/asm_offsets.h b/include/asm-sparc/asm_offsets.h index 5e0578bf1..d2f9a582b 100644 --- a/include/asm-sparc/asm_offsets.h +++ b/include/asm-sparc/asm_offsets.h @@ -14,170 +14,176 @@ #define ASIZ_task_addr_limit 0x00000004 #define AOFF_task_exec_domain 0x00000010 #define ASIZ_task_exec_domain 0x00000004 -#define AOFF_task_debugreg 0x00000014 -#define ASIZ_task_debugreg 0x00000020 -#define AOFF_task_counter 0x00000034 +#define AOFF_task_need_resched 0x00000014 +#define ASIZ_task_need_resched 0x00000004 +#define AOFF_task_counter 0x00000018 #define ASIZ_task_counter 0x00000004 -#define AOFF_task_priority 0x00000038 +#define AOFF_task_priority 0x0000001c #define ASIZ_task_priority 0x00000004 -#define AOFF_task_binfmt 0x0000003c -#define ASIZ_task_binfmt 0x00000004 -#define AOFF_task_next_task 0x00000040 +#define AOFF_task_has_cpu 0x00000020 +#define ASIZ_task_has_cpu 0x00000004 +#define AOFF_task_processor 0x00000024 +#define ASIZ_task_processor 0x00000004 +#define AOFF_task_last_processor 0x00000028 +#define ASIZ_task_last_processor 0x00000004 +#define AOFF_task_lock_depth 0x0000002c +#define ASIZ_task_lock_depth 0x00000004 +#define AOFF_task_next_task 0x00000030 #define ASIZ_task_next_task 0x00000004 -#define AOFF_task_prev_task 0x00000044 +#define AOFF_task_prev_task 0x00000034 #define ASIZ_task_prev_task 0x00000004 -#define AOFF_task_next_run 0x00000048 +#define AOFF_task_next_run 0x00000038 #define ASIZ_task_next_run 0x00000004 -#define AOFF_task_prev_run 0x0000004c +#define AOFF_task_prev_run 0x0000003c #define ASIZ_task_prev_run 0x00000004 -#define AOFF_task_exit_code 0x00000050 +#define AOFF_task_binfmt 0x00000040 +#define ASIZ_task_binfmt 0x00000004 +#define AOFF_task_exit_code 0x00000044 #define ASIZ_task_exit_code 0x00000004 -#define AOFF_task_exit_signal 0x00000054 +#define AOFF_task_exit_signal 0x00000048 #define ASIZ_task_exit_signal 0x00000004 -#define AOFF_task_pdeath_signal 0x00000058 +#define AOFF_task_pdeath_signal 0x0000004c #define ASIZ_task_pdeath_signal 0x00000004 -#define AOFF_task_personality 0x0000005c +#define AOFF_task_personality 0x00000050 #define ASIZ_task_personality 0x00000004 -#define AOFF_task_pid 0x00000064 +#define AOFF_task_pid 0x00000058 #define ASIZ_task_pid 0x00000004 -#define AOFF_task_pgrp 0x00000068 +#define AOFF_task_pgrp 0x0000005c #define ASIZ_task_pgrp 0x00000004 -#define AOFF_task_tty_old_pgrp 0x0000006c +#define AOFF_task_tty_old_pgrp 0x00000060 #define ASIZ_task_tty_old_pgrp 0x00000004 -#define AOFF_task_session 0x00000070 +#define AOFF_task_session 0x00000064 #define ASIZ_task_session 0x00000004 -#define AOFF_task_leader 0x00000074 +#define AOFF_task_leader 0x00000068 #define ASIZ_task_leader 0x00000004 -#define AOFF_task_ngroups 0x00000078 -#define ASIZ_task_ngroups 0x00000004 -#define AOFF_task_groups 0x0000007c -#define ASIZ_task_groups 0x00000040 -#define AOFF_task_p_opptr 0x000000bc +#define AOFF_task_p_opptr 0x0000006c #define ASIZ_task_p_opptr 0x00000004 -#define AOFF_task_p_pptr 0x000000c0 +#define AOFF_task_p_pptr 0x00000070 #define ASIZ_task_p_pptr 0x00000004 -#define AOFF_task_p_cptr 0x000000c4 +#define AOFF_task_p_cptr 0x00000074 #define ASIZ_task_p_cptr 0x00000004 -#define AOFF_task_p_ysptr 0x000000c8 +#define AOFF_task_p_ysptr 0x00000078 #define ASIZ_task_p_ysptr 0x00000004 -#define AOFF_task_p_osptr 0x000000cc +#define AOFF_task_p_osptr 0x0000007c #define ASIZ_task_p_osptr 0x00000004 -#define AOFF_task_pidhash_next 0x000000d0 +#define AOFF_task_pidhash_next 0x00000080 #define ASIZ_task_pidhash_next 0x00000004 -#define AOFF_task_pidhash_pprev 0x000000d4 +#define AOFF_task_pidhash_pprev 0x00000084 #define ASIZ_task_pidhash_pprev 0x00000004 -#define AOFF_task_tarray_ptr 0x000000d8 +#define AOFF_task_tarray_ptr 0x00000088 #define ASIZ_task_tarray_ptr 0x00000004 -#define AOFF_task_wait_chldexit 0x000000dc +#define AOFF_task_wait_chldexit 0x0000008c #define ASIZ_task_wait_chldexit 0x00000004 -#define AOFF_task_uid 0x000000e0 -#define ASIZ_task_uid 0x00000002 -#define AOFF_task_euid 0x000000e2 -#define ASIZ_task_euid 0x00000002 -#define AOFF_task_suid 0x000000e4 -#define ASIZ_task_suid 0x00000002 -#define AOFF_task_fsuid 0x000000e6 -#define ASIZ_task_fsuid 0x00000002 -#define AOFF_task_gid 0x000000e8 -#define ASIZ_task_gid 0x00000002 -#define AOFF_task_egid 0x000000ea -#define ASIZ_task_egid 0x00000002 -#define AOFF_task_sgid 0x000000ec -#define ASIZ_task_sgid 0x00000002 -#define AOFF_task_fsgid 0x000000ee -#define ASIZ_task_fsgid 0x00000002 -#define AOFF_task_timeout 0x000000f0 +#define AOFF_task_timeout 0x00000090 #define ASIZ_task_timeout 0x00000004 -#define AOFF_task_policy 0x000000f4 +#define AOFF_task_policy 0x00000094 #define ASIZ_task_policy 0x00000004 -#define AOFF_task_rt_priority 0x000000f8 +#define AOFF_task_rt_priority 0x00000098 #define ASIZ_task_rt_priority 0x00000004 -#define AOFF_task_it_real_value 0x000000fc +#define AOFF_task_it_real_value 0x0000009c #define ASIZ_task_it_real_value 0x00000004 -#define AOFF_task_it_prof_value 0x00000100 +#define AOFF_task_it_prof_value 0x000000a0 #define ASIZ_task_it_prof_value 0x00000004 -#define AOFF_task_it_virt_value 0x00000104 +#define AOFF_task_it_virt_value 0x000000a4 #define ASIZ_task_it_virt_value 0x00000004 -#define AOFF_task_it_real_incr 0x00000108 +#define AOFF_task_it_real_incr 0x000000a8 #define ASIZ_task_it_real_incr 0x00000004 -#define AOFF_task_it_prof_incr 0x0000010c +#define AOFF_task_it_prof_incr 0x000000ac #define ASIZ_task_it_prof_incr 0x00000004 -#define AOFF_task_it_virt_incr 0x00000110 +#define AOFF_task_it_virt_incr 0x000000b0 #define ASIZ_task_it_virt_incr 0x00000004 -#define AOFF_task_real_timer 0x00000114 +#define AOFF_task_real_timer 0x000000b4 #define ASIZ_task_real_timer 0x00000014 -#define AOFF_task_times 0x00000128 +#define AOFF_task_times 0x000000c8 #define ASIZ_task_times 0x00000010 -#define AOFF_task_start_time 0x00000138 +#define AOFF_task_start_time 0x000000d8 #define ASIZ_task_start_time 0x00000004 -#define AOFF_task_per_cpu_utime 0x0000013c +#define AOFF_task_per_cpu_utime 0x000000dc #define ASIZ_task_per_cpu_utime 0x00000004 -#define AOFF_task_min_flt 0x00000144 +#define AOFF_task_min_flt 0x000000e4 #define ASIZ_task_min_flt 0x00000004 -#define AOFF_task_maj_flt 0x00000148 +#define AOFF_task_maj_flt 0x000000e8 #define ASIZ_task_maj_flt 0x00000004 -#define AOFF_task_nswap 0x0000014c +#define AOFF_task_nswap 0x000000ec #define ASIZ_task_nswap 0x00000004 -#define AOFF_task_cmin_flt 0x00000150 +#define AOFF_task_cmin_flt 0x000000f0 #define ASIZ_task_cmin_flt 0x00000004 -#define AOFF_task_cmaj_flt 0x00000154 +#define AOFF_task_cmaj_flt 0x000000f4 #define ASIZ_task_cmaj_flt 0x00000004 -#define AOFF_task_cnswap 0x00000158 +#define AOFF_task_cnswap 0x000000f8 #define ASIZ_task_cnswap 0x00000004 -#define AOFF_task_swap_address 0x00000160 +#define AOFF_task_swap_address 0x00000100 #define ASIZ_task_swap_address 0x00000004 -#define AOFF_task_old_maj_flt 0x00000164 +#define AOFF_task_old_maj_flt 0x00000104 #define ASIZ_task_old_maj_flt 0x00000004 -#define AOFF_task_dec_flt 0x00000168 +#define AOFF_task_dec_flt 0x00000108 #define ASIZ_task_dec_flt 0x00000004 -#define AOFF_task_swap_cnt 0x0000016c +#define AOFF_task_swap_cnt 0x0000010c #define ASIZ_task_swap_cnt 0x00000004 +#define AOFF_task_uid 0x00000110 +#define ASIZ_task_uid 0x00000002 +#define AOFF_task_euid 0x00000112 +#define ASIZ_task_euid 0x00000002 +#define AOFF_task_suid 0x00000114 +#define ASIZ_task_suid 0x00000002 +#define AOFF_task_fsuid 0x00000116 +#define ASIZ_task_fsuid 0x00000002 +#define AOFF_task_gid 0x00000118 +#define ASIZ_task_gid 0x00000002 +#define AOFF_task_egid 0x0000011a +#define ASIZ_task_egid 0x00000002 +#define AOFF_task_sgid 0x0000011c +#define ASIZ_task_sgid 0x00000002 +#define AOFF_task_fsgid 0x0000011e +#define ASIZ_task_fsgid 0x00000002 +#define AOFF_task_ngroups 0x00000120 +#define ASIZ_task_ngroups 0x00000004 +#define AOFF_task_groups 0x00000124 +#define ASIZ_task_groups 0x00000040 +#define AOFF_task_cap_effective 0x00000164 +#define ASIZ_task_cap_effective 0x00000004 +#define AOFF_task_cap_inheritable 0x00000168 +#define ASIZ_task_cap_inheritable 0x00000004 +#define AOFF_task_cap_permitted 0x0000016c +#define ASIZ_task_cap_permitted 0x00000004 #define AOFF_task_rlim 0x00000170 #define ASIZ_task_rlim 0x00000050 #define AOFF_task_used_math 0x000001c0 #define ASIZ_task_used_math 0x00000002 -#define AOFF_task_io_usage 0x000001c4 -#define ASIZ_task_io_usage 0x00000004 -#define AOFF_task_comm 0x000001c8 +#define AOFF_task_comm 0x000001c2 #define ASIZ_task_comm 0x00000010 -#define AOFF_task_link_count 0x000001d8 +#define AOFF_task_link_count 0x000001d4 #define ASIZ_task_link_count 0x00000004 -#define AOFF_task_tty 0x000001dc +#define AOFF_task_tty 0x000001d8 #define ASIZ_task_tty 0x00000004 -#define AOFF_task_semundo 0x000001e0 +#define AOFF_task_semundo 0x000001dc #define ASIZ_task_semundo 0x00000004 -#define AOFF_task_semsleeping 0x000001e4 +#define AOFF_task_semsleeping 0x000001e0 #define ASIZ_task_semsleeping 0x00000004 -#define AOFF_task_ldt 0x000001e8 -#define ASIZ_task_ldt 0x00000004 -#define AOFF_task_tss 0x000001f0 -#define ASIZ_task_tss 0x00000390 -#define AOFF_task_fs 0x00000580 +#define AOFF_task_tss 0x000001e8 +#define ASIZ_task_tss 0x00000388 +#define AOFF_task_fs 0x00000570 #define ASIZ_task_fs 0x00000004 -#define AOFF_task_files 0x00000584 +#define AOFF_task_files 0x00000574 #define ASIZ_task_files 0x00000004 -#define AOFF_task_mm 0x00000588 +#define AOFF_task_mm 0x00000578 #define ASIZ_task_mm 0x00000004 -#define AOFF_task_sig 0x0000058c +#define AOFF_task_sigmask_lock 0x0000057c +#define ASIZ_task_sigmask_lock 0x00000000 +#define AOFF_task_sig 0x0000057c #define ASIZ_task_sig 0x00000004 -#define AOFF_task_signal 0x00000590 +#define AOFF_task_signal 0x00000580 #define ASIZ_task_signal 0x00000008 -#define AOFF_task_blocked 0x00000598 +#define AOFF_task_blocked 0x00000588 #define ASIZ_task_blocked 0x00000008 -#define AOFF_task_sigqueue 0x000005a0 +#define AOFF_task_sigqueue 0x00000590 #define ASIZ_task_sigqueue 0x00000004 -#define AOFF_task_sigqueue_tail 0x000005a4 +#define AOFF_task_sigqueue_tail 0x00000594 #define ASIZ_task_sigqueue_tail 0x00000004 -#define AOFF_task_has_cpu 0x000005a8 -#define ASIZ_task_has_cpu 0x00000004 -#define AOFF_task_processor 0x000005ac -#define ASIZ_task_processor 0x00000004 -#define AOFF_task_last_processor 0x000005b0 -#define ASIZ_task_last_processor 0x00000004 -#define AOFF_task_lock_depth 0x000005b4 -#define ASIZ_task_lock_depth 0x00000004 -#define AOFF_task_sigmask_lock 0x000005b8 -#define ASIZ_task_sigmask_lock 0x00000000 +#define AOFF_task_sas_ss_sp 0x00000598 +#define ASIZ_task_sas_ss_sp 0x00000004 +#define AOFF_task_sas_ss_size 0x0000059c +#define ASIZ_task_sas_ss_size 0x00000004 #define AOFF_mm_mmap 0x00000000 #define ASIZ_mm_mmap 0x00000004 #define AOFF_mm_mmap_cache 0x00000004 @@ -224,6 +230,8 @@ #define ASIZ_mm_def_flags 0x00000004 #define AOFF_mm_cpu_vm_mask 0x00000060 #define ASIZ_mm_cpu_vm_mask 0x00000004 +#define AOFF_mm_segments 0x00000064 +#define ASIZ_mm_segments 0x00000004 #define AOFF_thread_uwinmask 0x00000000 #define ASIZ_thread_uwinmask 0x00000004 #define AOFF_thread_kregs 0x00000004 @@ -258,15 +266,13 @@ #define ASIZ_thread_fpqdepth 0x00000004 #define AOFF_thread_fpqueue 0x000002d8 #define ASIZ_thread_fpqueue 0x00000080 -#define AOFF_thread_sstk_info 0x00000358 -#define ASIZ_thread_sstk_info 0x00000008 -#define AOFF_thread_flags 0x00000360 +#define AOFF_thread_flags 0x00000358 #define ASIZ_thread_flags 0x00000004 -#define AOFF_thread_current_ds 0x00000364 +#define AOFF_thread_current_ds 0x0000035c #define ASIZ_thread_current_ds 0x00000004 -#define AOFF_thread_core_exec 0x00000368 +#define AOFF_thread_core_exec 0x00000360 #define ASIZ_thread_core_exec 0x00000020 -#define AOFF_thread_new_signal 0x00000388 +#define AOFF_thread_new_signal 0x00000380 #define ASIZ_thread_new_signal 0x00000004 #else /* __SMP__ */ @@ -281,170 +287,176 @@ #define ASIZ_task_addr_limit 0x00000004 #define AOFF_task_exec_domain 0x00000010 #define ASIZ_task_exec_domain 0x00000004 -#define AOFF_task_debugreg 0x00000014 -#define ASIZ_task_debugreg 0x00000020 -#define AOFF_task_counter 0x00000034 +#define AOFF_task_need_resched 0x00000014 +#define ASIZ_task_need_resched 0x00000004 +#define AOFF_task_counter 0x00000018 #define ASIZ_task_counter 0x00000004 -#define AOFF_task_priority 0x00000038 +#define AOFF_task_priority 0x0000001c #define ASIZ_task_priority 0x00000004 -#define AOFF_task_binfmt 0x0000003c -#define ASIZ_task_binfmt 0x00000004 -#define AOFF_task_next_task 0x00000040 +#define AOFF_task_has_cpu 0x00000020 +#define ASIZ_task_has_cpu 0x00000004 +#define AOFF_task_processor 0x00000024 +#define ASIZ_task_processor 0x00000004 +#define AOFF_task_last_processor 0x00000028 +#define ASIZ_task_last_processor 0x00000004 +#define AOFF_task_lock_depth 0x0000002c +#define ASIZ_task_lock_depth 0x00000004 +#define AOFF_task_next_task 0x00000030 #define ASIZ_task_next_task 0x00000004 -#define AOFF_task_prev_task 0x00000044 +#define AOFF_task_prev_task 0x00000034 #define ASIZ_task_prev_task 0x00000004 -#define AOFF_task_next_run 0x00000048 +#define AOFF_task_next_run 0x00000038 #define ASIZ_task_next_run 0x00000004 -#define AOFF_task_prev_run 0x0000004c +#define AOFF_task_prev_run 0x0000003c #define ASIZ_task_prev_run 0x00000004 -#define AOFF_task_exit_code 0x00000050 +#define AOFF_task_binfmt 0x00000040 +#define ASIZ_task_binfmt 0x00000004 +#define AOFF_task_exit_code 0x00000044 #define ASIZ_task_exit_code 0x00000004 -#define AOFF_task_exit_signal 0x00000054 +#define AOFF_task_exit_signal 0x00000048 #define ASIZ_task_exit_signal 0x00000004 -#define AOFF_task_pdeath_signal 0x00000058 +#define AOFF_task_pdeath_signal 0x0000004c #define ASIZ_task_pdeath_signal 0x00000004 -#define AOFF_task_personality 0x0000005c +#define AOFF_task_personality 0x00000050 #define ASIZ_task_personality 0x00000004 -#define AOFF_task_pid 0x00000064 +#define AOFF_task_pid 0x00000058 #define ASIZ_task_pid 0x00000004 -#define AOFF_task_pgrp 0x00000068 +#define AOFF_task_pgrp 0x0000005c #define ASIZ_task_pgrp 0x00000004 -#define AOFF_task_tty_old_pgrp 0x0000006c +#define AOFF_task_tty_old_pgrp 0x00000060 #define ASIZ_task_tty_old_pgrp 0x00000004 -#define AOFF_task_session 0x00000070 +#define AOFF_task_session 0x00000064 #define ASIZ_task_session 0x00000004 -#define AOFF_task_leader 0x00000074 +#define AOFF_task_leader 0x00000068 #define ASIZ_task_leader 0x00000004 -#define AOFF_task_ngroups 0x00000078 -#define ASIZ_task_ngroups 0x00000004 -#define AOFF_task_groups 0x0000007c -#define ASIZ_task_groups 0x00000040 -#define AOFF_task_p_opptr 0x000000bc +#define AOFF_task_p_opptr 0x0000006c #define ASIZ_task_p_opptr 0x00000004 -#define AOFF_task_p_pptr 0x000000c0 +#define AOFF_task_p_pptr 0x00000070 #define ASIZ_task_p_pptr 0x00000004 -#define AOFF_task_p_cptr 0x000000c4 +#define AOFF_task_p_cptr 0x00000074 #define ASIZ_task_p_cptr 0x00000004 -#define AOFF_task_p_ysptr 0x000000c8 +#define AOFF_task_p_ysptr 0x00000078 #define ASIZ_task_p_ysptr 0x00000004 -#define AOFF_task_p_osptr 0x000000cc +#define AOFF_task_p_osptr 0x0000007c #define ASIZ_task_p_osptr 0x00000004 -#define AOFF_task_pidhash_next 0x000000d0 +#define AOFF_task_pidhash_next 0x00000080 #define ASIZ_task_pidhash_next 0x00000004 -#define AOFF_task_pidhash_pprev 0x000000d4 +#define AOFF_task_pidhash_pprev 0x00000084 #define ASIZ_task_pidhash_pprev 0x00000004 -#define AOFF_task_tarray_ptr 0x000000d8 +#define AOFF_task_tarray_ptr 0x00000088 #define ASIZ_task_tarray_ptr 0x00000004 -#define AOFF_task_wait_chldexit 0x000000dc +#define AOFF_task_wait_chldexit 0x0000008c #define ASIZ_task_wait_chldexit 0x00000004 -#define AOFF_task_uid 0x000000e0 -#define ASIZ_task_uid 0x00000002 -#define AOFF_task_euid 0x000000e2 -#define ASIZ_task_euid 0x00000002 -#define AOFF_task_suid 0x000000e4 -#define ASIZ_task_suid 0x00000002 -#define AOFF_task_fsuid 0x000000e6 -#define ASIZ_task_fsuid 0x00000002 -#define AOFF_task_gid 0x000000e8 -#define ASIZ_task_gid 0x00000002 -#define AOFF_task_egid 0x000000ea -#define ASIZ_task_egid 0x00000002 -#define AOFF_task_sgid 0x000000ec -#define ASIZ_task_sgid 0x00000002 -#define AOFF_task_fsgid 0x000000ee -#define ASIZ_task_fsgid 0x00000002 -#define AOFF_task_timeout 0x000000f0 +#define AOFF_task_timeout 0x00000090 #define ASIZ_task_timeout 0x00000004 -#define AOFF_task_policy 0x000000f4 +#define AOFF_task_policy 0x00000094 #define ASIZ_task_policy 0x00000004 -#define AOFF_task_rt_priority 0x000000f8 +#define AOFF_task_rt_priority 0x00000098 #define ASIZ_task_rt_priority 0x00000004 -#define AOFF_task_it_real_value 0x000000fc +#define AOFF_task_it_real_value 0x0000009c #define ASIZ_task_it_real_value 0x00000004 -#define AOFF_task_it_prof_value 0x00000100 +#define AOFF_task_it_prof_value 0x000000a0 #define ASIZ_task_it_prof_value 0x00000004 -#define AOFF_task_it_virt_value 0x00000104 +#define AOFF_task_it_virt_value 0x000000a4 #define ASIZ_task_it_virt_value 0x00000004 -#define AOFF_task_it_real_incr 0x00000108 +#define AOFF_task_it_real_incr 0x000000a8 #define ASIZ_task_it_real_incr 0x00000004 -#define AOFF_task_it_prof_incr 0x0000010c +#define AOFF_task_it_prof_incr 0x000000ac #define ASIZ_task_it_prof_incr 0x00000004 -#define AOFF_task_it_virt_incr 0x00000110 +#define AOFF_task_it_virt_incr 0x000000b0 #define ASIZ_task_it_virt_incr 0x00000004 -#define AOFF_task_real_timer 0x00000114 +#define AOFF_task_real_timer 0x000000b4 #define ASIZ_task_real_timer 0x00000014 -#define AOFF_task_times 0x00000128 +#define AOFF_task_times 0x000000c8 #define ASIZ_task_times 0x00000010 -#define AOFF_task_start_time 0x00000138 +#define AOFF_task_start_time 0x000000d8 #define ASIZ_task_start_time 0x00000004 -#define AOFF_task_per_cpu_utime 0x0000013c +#define AOFF_task_per_cpu_utime 0x000000dc #define ASIZ_task_per_cpu_utime 0x00000080 -#define AOFF_task_min_flt 0x0000023c +#define AOFF_task_min_flt 0x000001dc #define ASIZ_task_min_flt 0x00000004 -#define AOFF_task_maj_flt 0x00000240 +#define AOFF_task_maj_flt 0x000001e0 #define ASIZ_task_maj_flt 0x00000004 -#define AOFF_task_nswap 0x00000244 +#define AOFF_task_nswap 0x000001e4 #define ASIZ_task_nswap 0x00000004 -#define AOFF_task_cmin_flt 0x00000248 +#define AOFF_task_cmin_flt 0x000001e8 #define ASIZ_task_cmin_flt 0x00000004 -#define AOFF_task_cmaj_flt 0x0000024c +#define AOFF_task_cmaj_flt 0x000001ec #define ASIZ_task_cmaj_flt 0x00000004 -#define AOFF_task_cnswap 0x00000250 +#define AOFF_task_cnswap 0x000001f0 #define ASIZ_task_cnswap 0x00000004 -#define AOFF_task_swap_address 0x00000258 +#define AOFF_task_swap_address 0x000001f8 #define ASIZ_task_swap_address 0x00000004 -#define AOFF_task_old_maj_flt 0x0000025c +#define AOFF_task_old_maj_flt 0x000001fc #define ASIZ_task_old_maj_flt 0x00000004 -#define AOFF_task_dec_flt 0x00000260 +#define AOFF_task_dec_flt 0x00000200 #define ASIZ_task_dec_flt 0x00000004 -#define AOFF_task_swap_cnt 0x00000264 +#define AOFF_task_swap_cnt 0x00000204 #define ASIZ_task_swap_cnt 0x00000004 +#define AOFF_task_uid 0x00000208 +#define ASIZ_task_uid 0x00000002 +#define AOFF_task_euid 0x0000020a +#define ASIZ_task_euid 0x00000002 +#define AOFF_task_suid 0x0000020c +#define ASIZ_task_suid 0x00000002 +#define AOFF_task_fsuid 0x0000020e +#define ASIZ_task_fsuid 0x00000002 +#define AOFF_task_gid 0x00000210 +#define ASIZ_task_gid 0x00000002 +#define AOFF_task_egid 0x00000212 +#define ASIZ_task_egid 0x00000002 +#define AOFF_task_sgid 0x00000214 +#define ASIZ_task_sgid 0x00000002 +#define AOFF_task_fsgid 0x00000216 +#define ASIZ_task_fsgid 0x00000002 +#define AOFF_task_ngroups 0x00000218 +#define ASIZ_task_ngroups 0x00000004 +#define AOFF_task_groups 0x0000021c +#define ASIZ_task_groups 0x00000040 +#define AOFF_task_cap_effective 0x0000025c +#define ASIZ_task_cap_effective 0x00000004 +#define AOFF_task_cap_inheritable 0x00000260 +#define ASIZ_task_cap_inheritable 0x00000004 +#define AOFF_task_cap_permitted 0x00000264 +#define ASIZ_task_cap_permitted 0x00000004 #define AOFF_task_rlim 0x00000268 #define ASIZ_task_rlim 0x00000050 #define AOFF_task_used_math 0x000002b8 #define ASIZ_task_used_math 0x00000002 -#define AOFF_task_io_usage 0x000002bc -#define ASIZ_task_io_usage 0x00000004 -#define AOFF_task_comm 0x000002c0 +#define AOFF_task_comm 0x000002ba #define ASIZ_task_comm 0x00000010 -#define AOFF_task_link_count 0x000002d0 +#define AOFF_task_link_count 0x000002cc #define ASIZ_task_link_count 0x00000004 -#define AOFF_task_tty 0x000002d4 +#define AOFF_task_tty 0x000002d0 #define ASIZ_task_tty 0x00000004 -#define AOFF_task_semundo 0x000002d8 +#define AOFF_task_semundo 0x000002d4 #define ASIZ_task_semundo 0x00000004 -#define AOFF_task_semsleeping 0x000002dc +#define AOFF_task_semsleeping 0x000002d8 #define ASIZ_task_semsleeping 0x00000004 -#define AOFF_task_ldt 0x000002e0 -#define ASIZ_task_ldt 0x00000004 -#define AOFF_task_tss 0x000002e8 -#define ASIZ_task_tss 0x00000390 -#define AOFF_task_fs 0x00000678 +#define AOFF_task_tss 0x000002e0 +#define ASIZ_task_tss 0x00000388 +#define AOFF_task_fs 0x00000668 #define ASIZ_task_fs 0x00000004 -#define AOFF_task_files 0x0000067c +#define AOFF_task_files 0x0000066c #define ASIZ_task_files 0x00000004 -#define AOFF_task_mm 0x00000680 +#define AOFF_task_mm 0x00000670 #define ASIZ_task_mm 0x00000004 -#define AOFF_task_sig 0x00000684 +#define AOFF_task_sigmask_lock 0x00000674 +#define ASIZ_task_sigmask_lock 0x00000001 +#define AOFF_task_sig 0x00000678 #define ASIZ_task_sig 0x00000004 -#define AOFF_task_signal 0x00000688 +#define AOFF_task_signal 0x0000067c #define ASIZ_task_signal 0x00000008 -#define AOFF_task_blocked 0x00000690 +#define AOFF_task_blocked 0x00000684 #define ASIZ_task_blocked 0x00000008 -#define AOFF_task_sigqueue 0x00000698 +#define AOFF_task_sigqueue 0x0000068c #define ASIZ_task_sigqueue 0x00000004 -#define AOFF_task_sigqueue_tail 0x0000069c +#define AOFF_task_sigqueue_tail 0x00000690 #define ASIZ_task_sigqueue_tail 0x00000004 -#define AOFF_task_has_cpu 0x000006a0 -#define ASIZ_task_has_cpu 0x00000004 -#define AOFF_task_processor 0x000006a4 -#define ASIZ_task_processor 0x00000004 -#define AOFF_task_last_processor 0x000006a8 -#define ASIZ_task_last_processor 0x00000004 -#define AOFF_task_lock_depth 0x000006ac -#define ASIZ_task_lock_depth 0x00000004 -#define AOFF_task_sigmask_lock 0x000006b0 -#define ASIZ_task_sigmask_lock 0x00000001 +#define AOFF_task_sas_ss_sp 0x00000694 +#define ASIZ_task_sas_ss_sp 0x00000004 +#define AOFF_task_sas_ss_size 0x00000698 +#define ASIZ_task_sas_ss_size 0x00000004 #define AOFF_mm_mmap 0x00000000 #define ASIZ_mm_mmap 0x00000004 #define AOFF_mm_mmap_cache 0x00000004 @@ -491,6 +503,8 @@ #define ASIZ_mm_def_flags 0x00000004 #define AOFF_mm_cpu_vm_mask 0x00000060 #define ASIZ_mm_cpu_vm_mask 0x00000004 +#define AOFF_mm_segments 0x00000064 +#define ASIZ_mm_segments 0x00000004 #define AOFF_thread_uwinmask 0x00000000 #define ASIZ_thread_uwinmask 0x00000004 #define AOFF_thread_kregs 0x00000004 @@ -525,15 +539,13 @@ #define ASIZ_thread_fpqdepth 0x00000004 #define AOFF_thread_fpqueue 0x000002d8 #define ASIZ_thread_fpqueue 0x00000080 -#define AOFF_thread_sstk_info 0x00000358 -#define ASIZ_thread_sstk_info 0x00000008 -#define AOFF_thread_flags 0x00000360 +#define AOFF_thread_flags 0x00000358 #define ASIZ_thread_flags 0x00000004 -#define AOFF_thread_current_ds 0x00000364 +#define AOFF_thread_current_ds 0x0000035c #define ASIZ_thread_current_ds 0x00000004 -#define AOFF_thread_core_exec 0x00000368 +#define AOFF_thread_core_exec 0x00000360 #define ASIZ_thread_core_exec 0x00000020 -#define AOFF_thread_new_signal 0x00000388 +#define AOFF_thread_new_signal 0x00000380 #define ASIZ_thread_new_signal 0x00000004 #endif /* __SMP__ */ diff --git a/include/asm-sparc/audioio.h b/include/asm-sparc/audioio.h new file mode 100644 index 000000000..93e8c33dd --- /dev/null +++ b/include/asm-sparc/audioio.h @@ -0,0 +1,416 @@ +/* + * include/asm-sparc/audioio.h + * + * Sparc Audio Midlayer + * Copyright (C) 1996 Thomas K. Dyas (tdyas@noc.rutgers.edu) + */ + +#ifndef _AUDIOIO_H_ +#define _AUDIOIO_H_ + +/* + * SunOS/Solaris /dev/audio interface + */ + +#if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) +#include <linux/types.h> +#include <linux/time.h> +#include <linux/ioctl.h> +#endif + +/* + * This structure contains state information for audio device IO streams. + */ +typedef struct audio_prinfo { + /* + * The following values describe the audio data encoding. + */ + unsigned int sample_rate; /* samples per second */ + unsigned int channels; /* number of interleaved channels */ + unsigned int precision; /* bit-width of each sample */ + unsigned int encoding; /* data encoding method */ + + /* + * The following values control audio device configuration + */ + unsigned int gain; /* gain level: 0 - 255 */ + unsigned int port; /* selected I/O port (see below) */ + unsigned int avail_ports; /* available I/O ports (see below) */ + unsigned int _xxx[2]; /* Reserved for future use */ + + unsigned int buffer_size; /* I/O buffer size */ + + /* + * The following values describe driver state + */ + unsigned int samples; /* number of samples converted */ + unsigned int eof; /* End Of File counter (play only) */ + + unsigned char pause; /* non-zero for pause, zero to resume */ + unsigned char error; /* non-zero if overflow/underflow */ + unsigned char waiting; /* non-zero if a process wants access */ + unsigned char balance; /* stereo channel balance */ + + unsigned short minordev; + + /* + * The following values are read-only state flags + */ + unsigned char open; /* non-zero if open access permitted */ + unsigned char active; /* non-zero if I/O is active */ +} audio_prinfo_t; + + +/* + * This structure describes the current state of the audio device. + */ +typedef struct audio_info { + /* + * Per-stream information + */ + audio_prinfo_t play; /* output status information */ + audio_prinfo_t record; /* input status information */ + + /* + * Per-unit/channel information + */ + unsigned int monitor_gain; /* input to output mix: 0 - 255 */ + unsigned char output_muted; /* non-zero if output is muted */ + unsigned char _xxx[3]; /* Reserved for future use */ + unsigned int _yyy[3]; /* Reserved for future use */ +} audio_info_t; + + +/* + * Audio encoding types + */ +#define AUDIO_ENCODING_NONE (0) /* no encoding assigned */ +#define AUDIO_ENCODING_ULAW (1) /* u-law encoding */ +#define AUDIO_ENCODING_ALAW (2) /* A-law encoding */ +#define AUDIO_ENCODING_LINEAR (3) /* Linear PCM encoding */ +#define AUDIO_ENCODING_DVI (104) /* DVI ADPCM */ +#define AUDIO_ENCODING_LINEAR8 (105) /* 8 bit UNSIGNED */ +#define AUDIO_ENCODING_LINEARLE (106) /* Linear PCM LE encoding */ + +/* + * These ranges apply to record, play, and monitor gain values + */ +#define AUDIO_MIN_GAIN (0) /* minimum gain value */ +#define AUDIO_MAX_GAIN (255) /* maximum gain value */ + +/* + * These values apply to the balance field to adjust channel gain values + */ +#define AUDIO_LEFT_BALANCE (0) /* left channel only */ +#define AUDIO_MID_BALANCE (32) /* equal left/right channel */ +#define AUDIO_RIGHT_BALANCE (64) /* right channel only */ +#define AUDIO_BALANCE_SHIFT (3) + +/* + * Generic minimum/maximum limits for number of channels, both modes + */ +#define AUDIO_MIN_PLAY_CHANNELS (1) +#define AUDIO_MAX_PLAY_CHANNELS (4) +#define AUDIO_MIN_REC_CHANNELS (1) +#define AUDIO_MAX_REC_CHANNELS (4) + +/* + * Generic minimum/maximum limits for sample precision + */ +#define AUDIO_MIN_PLAY_PRECISION (8) +#define AUDIO_MAX_PLAY_PRECISION (32) +#define AUDIO_MIN_REC_PRECISION (8) +#define AUDIO_MAX_REC_PRECISION (32) + +/* + * Define some convenient names for typical audio ports + */ +/* + * output ports (several may be enabled simultaneously) + */ +#define AUDIO_SPEAKER 0x01 /* output to built-in speaker */ +#define AUDIO_HEADPHONE 0x02 /* output to headphone jack */ +#define AUDIO_LINE_OUT 0x04 /* output to line out */ + +/* + * input ports (usually only one at a time) + */ +#define AUDIO_MICROPHONE 0x01 /* input from microphone */ +#define AUDIO_LINE_IN 0x02 /* input from line in */ +#define AUDIO_CD 0x04 /* input from on-board CD inputs */ +#define AUDIO_INTERNAL_CD_IN AUDIO_CD /* input from internal CDROM */ +/* Supposedly an undocumented feature of the 4231 */ +#define AUDIO_ANALOG_LOOPBACK 0x40 + + +/* + * This macro initializes an audio_info structure to 'harmless' values. + * Note that (~0) might not be a harmless value for a flag that was + * a signed int. + */ +#define AUDIO_INITINFO(i) { \ + unsigned int *__x__; \ + for (__x__ = (unsigned int *)(i); \ + (char *) __x__ < (((char *)(i)) + sizeof (audio_info_t)); \ + *__x__++ = ~0); \ +} + +/* + * These allow testing for what the user wants to set + */ +#define AUD_INITVALUE (~0) +#define Modify(X) ((unsigned int)(X) != AUD_INITVALUE) +#define Modifys(X) ((X) != (unsigned short)AUD_INITVALUE) +#define Modifyc(X) ((X) != (unsigned char)AUD_INITVALUE) + +/* + * Parameter for the AUDIO_GETDEV ioctl to determine current + * audio devices. + */ +#define MAX_AUDIO_DEV_LEN (16) +typedef struct audio_device { + char name[MAX_AUDIO_DEV_LEN]; + char version[MAX_AUDIO_DEV_LEN]; + char config[MAX_AUDIO_DEV_LEN]; +} audio_device_t; + + +/* + * Ioctl calls for the audio device. + */ + +/* + * AUDIO_GETINFO retrieves the current state of the audio device. + * + * AUDIO_SETINFO copies all fields of the audio_info structure whose + * values are not set to the initialized value (-1) to the device state. + * It performs an implicit AUDIO_GETINFO to return the new state of the + * device. Note that the record.samples and play.samples fields are set + * to the last value before the AUDIO_SETINFO took effect. This allows + * an application to reset the counters while atomically retrieving the + * last value. + * + * AUDIO_DRAIN suspends the calling process until the write buffers are + * empty. + * + * AUDIO_GETDEV returns a structure of type audio_device_t which contains + * three strings. The string "name" is a short identifying string (for + * example, the SBus Fcode name string), the string "version" identifies + * the current version of the device, and the "config" string identifies + * the specific configuration of the audio stream. All fields are + * device-dependent -- see the device specific manual pages for details. + * + * AUDIO_GETDEV_SUNOS returns a number which is an audio device defined + * herein (making it not too portable) + * + * AUDIO_FLUSH stops all playback and recording, clears all queued buffers, + * resets error counters, and restarts recording and playback as appropriate + * for the current sampling mode. + */ +#define AUDIO_GETINFO _IOR('A', 1, audio_info_t) +#define AUDIO_SETINFO _IOWR('A', 2, audio_info_t) +#define AUDIO_DRAIN _IO('A', 3) +#define AUDIO_GETDEV _IOR('A', 4, audio_device_t) +#define AUDIO_GETDEV_SUNOS _IOR('A', 4, int) +#define AUDIO_FLUSH _IO('A', 5) + +/* Define possible audio hardware configurations for + * old SunOS-style AUDIO_GETDEV ioctl */ +#define AUDIO_DEV_UNKNOWN (0) /* not defined */ +#define AUDIO_DEV_AMD (1) /* audioamd device */ +#define AUDIO_DEV_SPEAKERBOX (2) /* dbri device with speakerbox */ +#define AUDIO_DEV_CODEC (3) /* dbri device (internal speaker) */ +#define AUDIO_DEV_CS4231 (5) /* cs4231 device */ + +/* + * The following ioctl sets the audio device into an internal loopback mode, + * if the hardware supports this. The argument is TRUE to set loopback, + * FALSE to reset to normal operation. If the hardware does not support + * internal loopback, the ioctl should fail with EINVAL. + */ +#define AUDIO_DIAG_LOOPBACK _IOW('A', 101, int) + +#ifdef notneeded +/* + * Structure sent up as a M_PROTO message on trace streams + */ +typedef struct audtrace_hdr audtrace_hdr_t; +struct audtrace_hdr { + unsigned int seq; /* Sequence number (per-aud_stream) */ + int type; /* device-dependent */ + struct timeval timestamp; + char _f[8]; /* filler */ +}; +#endif + +/* + * Linux kernel internal implementation. + */ + +#ifdef __KERNEL__ + +#include <linux/types.h> +#include <linux/fs.h> +#include <linux/tqueue.h> +#include <linux/wait.h> + +#define SDF_OPEN_WRITE 0x00000001 +#define SDF_OPEN_READ 0x00000002 + +struct sparcaudio_driver +{ + const char * name; + struct sparcaudio_operations *ops; + void *private; + unsigned long flags; + + /* This device */ + struct linux_sbus_device *dev; + + /* Processes blocked on open() sit here. */ + struct wait_queue *open_wait; + + /* Task queue for this driver's bottom half. */ + struct tq_struct tqueue; + + /* Support for a circular queue of output buffers. */ + __u8 **output_buffers; + size_t *output_sizes, output_size; + int num_output_buffers, output_front, output_rear; + int output_count, output_active, playing_count; + struct wait_queue *output_write_wait, *output_drain_wait; + + /* Support for a circular queue of input buffers. */ + __u8 **input_buffers; + int input_offset; + int num_input_buffers, input_front, input_rear; + int input_count, input_active, recording_count; + struct wait_queue *input_read_wait; +}; + +struct sparcaudio_operations +{ + int (*open)(struct inode *, struct file *, struct sparcaudio_driver *); + void (*release)(struct inode *, struct file *, struct + sparcaudio_driver *); + int (*ioctl)(struct inode *, struct file *, unsigned int, + unsigned long, struct sparcaudio_driver *); + + /* Ask driver to begin playing a buffer. */ + void (*start_output)(struct sparcaudio_driver *, __u8 *, + unsigned long); + + /* Ask driver to stop playing a buffer. */ + void (*stop_output)(struct sparcaudio_driver *); + + /* Ask driver to begin recording into a buffer. */ + void (*start_input)(struct sparcaudio_driver *, __u8 *, unsigned long); + + /* Ask driver to stop recording. */ + void (*stop_input)(struct sparcaudio_driver *); + + /* Return driver name/version to caller. (/dev/audio specific) */ + void (*sunaudio_getdev)(struct sparcaudio_driver *, audio_device_t *); + + /* Get and set the output volume. (0-255) */ + int (*set_output_volume)(struct sparcaudio_driver *, int); + int (*get_output_volume)(struct sparcaudio_driver *); + + /* Get and set the input volume. (0-255) */ + int (*set_input_volume)(struct sparcaudio_driver *, int); + int (*get_input_volume)(struct sparcaudio_driver *); + + /* Get and set the monitor volume. (0-255) */ + int (*set_monitor_volume)(struct sparcaudio_driver *, int); + int (*get_monitor_volume)(struct sparcaudio_driver *); + + /* Get and set the output balance. (0-64) */ + int (*set_output_balance)(struct sparcaudio_driver *, int); + int (*get_output_balance)(struct sparcaudio_driver *); + + /* Get and set the input balance. (0-64) */ + int (*set_input_balance)(struct sparcaudio_driver *, int); + int (*get_input_balance)(struct sparcaudio_driver *); + + /* Get and set the output channels. (1-4) */ + int (*set_output_channels)(struct sparcaudio_driver *, int); + int (*get_output_channels)(struct sparcaudio_driver *); + + /* Get and set the input channels. (1-4) */ + int (*set_input_channels)(struct sparcaudio_driver *, int); + int (*get_input_channels)(struct sparcaudio_driver *); + + /* Get and set the output precision. (8-32) */ + int (*set_output_precision)(struct sparcaudio_driver *, int); + int (*get_output_precision)(struct sparcaudio_driver *); + + /* Get and set the input precision. (8-32) */ + int (*set_input_precision)(struct sparcaudio_driver *, int); + int (*get_input_precision)(struct sparcaudio_driver *); + + /* Get and set the output port. () */ + int (*set_output_port)(struct sparcaudio_driver *, int); + int (*get_output_port)(struct sparcaudio_driver *); + + /* Get and set the input port. () */ + int (*set_input_port)(struct sparcaudio_driver *, int); + int (*get_input_port)(struct sparcaudio_driver *); + + /* Get and set the output encoding. () */ + int (*set_output_encoding)(struct sparcaudio_driver *, int); + int (*get_output_encoding)(struct sparcaudio_driver *); + + /* Get and set the input encoding. () */ + int (*set_input_encoding)(struct sparcaudio_driver *, int); + int (*get_input_encoding)(struct sparcaudio_driver *); + + /* Get and set the output rate. () */ + int (*set_output_rate)(struct sparcaudio_driver *, int); + int (*get_output_rate)(struct sparcaudio_driver *); + + /* Get and set the input rate. () */ + int (*set_input_rate)(struct sparcaudio_driver *, int); + int (*get_input_rate)(struct sparcaudio_driver *); + + /* Return driver number to caller. (SunOS /dev/audio specific) */ + int (*sunaudio_getdev_sunos)(struct sparcaudio_driver *); + + /* Get available ports */ + int (*get_output_ports)(struct sparcaudio_driver *); + int (*get_input_ports)(struct sparcaudio_driver *); + + /* Get and set output mute */ + int (*set_output_muted)(struct sparcaudio_driver *, int); + int (*get_output_muted)(struct sparcaudio_driver *); +}; + +extern int register_sparcaudio_driver(struct sparcaudio_driver *); +extern int unregister_sparcaudio_driver(struct sparcaudio_driver *); +extern void sparcaudio_output_done(struct sparcaudio_driver *, int); +extern void sparcaudio_input_done(struct sparcaudio_driver *); +extern int sparcaudio_init(void); +extern int amd7930_init(void); +extern int cs4231_init(void); + +#endif + +/* Macros to convert between mixer stereo volumes and gain (mono) */ +#define s_to_m(a) (((((a) >> 8) & 0x7f) + ((a) & 0x7f)) / 2) +#define m_to_s(a) (((a) << 8) + (a)) + +/* convert mixer stereo volume to balance */ +#define s_to_b(a) (AUDIO_RIGHT_BALANCE * ((((a) >> 8) & 0xff) / (((((a) >> 8) & 0xff) + ((a) & 0xff)) / 2))) + +/* convert mixer stereo volume to audio gain */ +#define s_to_g(a) (((((a) >> 8) & 0xff) + ((a) & 0xff)) / 2) + +/* convert gain a and balance b to mixer volume */ +#define b_to_s(a,b) ((a * (b / AUDIO_RIGHT_BALANCE) << 8) + (a * (1 - (b / AUDIO_RIGHT_BALANCE)))) + +#define SPARCAUDIO_MIXER_MINOR 0 +#define SPARCAUDIO_DSP16_MINOR 1 +#define SPARCAUDIO_DSP_MINOR 3 +#define SPARCAUDIO_AUDIO_MINOR 4 +#define SPARCAUDIO_AUDIOCTL_MINOR 5 +#define SPARCAUDIO_STATUS_MINOR 6 +#endif diff --git a/include/asm-sparc/bitops.h b/include/asm-sparc/bitops.h index dbc259cb6..7c3e4d0da 100644 --- a/include/asm-sparc/bitops.h +++ b/include/asm-sparc/bitops.h @@ -1,4 +1,4 @@ -/* $Id: bitops.h,v 1.49 1998/02/23 01:46:44 rth Exp $ +/* $Id: bitops.h,v 1.51 1998/07/26 03:05:37 davem Exp $ * bitops.h: Bit string operations on the Sparc. * * Copyright 1995 David S. Miller (davem@caip.rutgers.edu) @@ -182,6 +182,27 @@ extern __inline__ unsigned long ffz(unsigned long word) return result; } +#ifdef __KERNEL__ + +/* + * ffs: find first bit set. This is defined the same way as + * the libc and compiler builtin ffs routines, therefore + * differs in spirit from the above ffz (man ffs). + */ + +#define ffs(x) generic_ffs(x) + +/* + * hweightN: returns the hamming weight (i.e. the number + * of bits set) of a N-bit word + */ + +#define hweight32(x) generic_hweight32(x) +#define hweight16(x) generic_hweight16(x) +#define hweight8(x) generic_hweight8(x) + +#endif /* __KERNEL__ */ + /* find_next_zero_bit() finds the first zero bit in a bit string of length * 'size' bits, starting the search at bit 'offset'. This is largely based * on Linus's ALPHA routines, which are pretty portable BTW. diff --git a/include/asm-sparc/dma.h b/include/asm-sparc/dma.h index a9f43c034..cb45374d6 100644 --- a/include/asm-sparc/dma.h +++ b/include/asm-sparc/dma.h @@ -1,4 +1,4 @@ -/* $Id: dma.h,v 1.25 1998/02/09 13:27:01 jj Exp $ +/* $Id: dma.h,v 1.26 1998/04/13 07:27:05 davem Exp $ * include/asm-sparc/dma.h * * Copyright 1995 (C) David S. Miller (davem@caip.rutgers.edu) @@ -82,7 +82,7 @@ extern struct Linux_SBus_DMA *dma_chain; #define DMA_ISESC1(dma) ((dma)->revision == dvmaesc1) /* Main routines in dma.c */ -extern unsigned long dvma_init(struct linux_sbus *, unsigned long); +extern void dvma_init(struct linux_sbus *); /* Fields in the cond_reg register */ /* First, the version identification bits */ diff --git a/include/asm-sparc/elf.h b/include/asm-sparc/elf.h index ac1fc8300..fb680d30f 100644 --- a/include/asm-sparc/elf.h +++ b/include/asm-sparc/elf.h @@ -1,4 +1,4 @@ -/* $Id: elf.h,v 1.15 1998/03/23 08:41:32 jj Exp $ */ +/* $Id: elf.h,v 1.17 1998/05/11 08:40:10 davem Exp $ */ #ifndef __ASMSPARC_ELF_H #define __ASMSPARC_ELF_H diff --git a/include/asm-sparc/fbio.h b/include/asm-sparc/fbio.h index 6d2f1e730..443e3b184 100644 --- a/include/asm-sparc/fbio.h +++ b/include/asm-sparc/fbio.h @@ -56,8 +56,13 @@ struct fbcmap { unsigned char *blue; }; +#ifdef __KERNEL__ +#define FBIOPUTCMAP_SPARC _IOW('F', 3, struct fbcmap) +#define FBIOGETCMAP_SPARC _IOW('F', 4, struct fbcmap) +#else #define FBIOPUTCMAP _IOW('F', 3, struct fbcmap) #define FBIOGETCMAP _IOW('F', 4, struct fbcmap) +#endif /* # of device specific values */ #define FB_ATTR_NDEVSPECIFIC 8 diff --git a/include/asm-sparc/irq.h b/include/asm-sparc/irq.h index 526aeef9c..342c90e64 100644 --- a/include/asm-sparc/irq.h +++ b/include/asm-sparc/irq.h @@ -1,4 +1,4 @@ -/* $Id: irq.h,v 1.22 1998/02/05 14:20:05 jj Exp $ +/* $Id: irq.h,v 1.25 1998/06/04 09:55:04 jj Exp $ * irq.h: IRQ registers on the Sparc. * * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) @@ -12,16 +12,10 @@ #include <asm/system.h> /* For NCPUS */ #include <asm/btfixup.h> -/* This is used for sun4d */ -struct devid_cookie { - /* Caller specifies these. */ - void *real_dev_id; /* What dev_id would usually contain. */ - void *bus_cookie; /* linux_sbus_device *, etc. */ - /* Return values. */ - unsigned int ret_ino; -}; - -#define SA_DCOOKIE 0x10000 +#define __irq_ino(irq) irq +#define __irq_pil(irq) irq +BTFIXUPDEF_CALL(char *, __irq_itoa, unsigned int) +#define __irq_itoa(irq) BTFIXUP_CALL(__irq_itoa)(irq) #define NR_IRQS 15 @@ -67,11 +61,6 @@ extern __inline__ void irq_exit(int cpu, int irq) #define irq_exit(cpu, irq) (local_irq_count[cpu]--) #endif -static __inline__ int irq_cannonicalize(int irq) -{ - return irq; -} - /* Dave Redman (djhr@tadpole.co.uk) * changed these to function pointers.. it saves cycles and will allow * the irq dependencies to be split into different files at a later date diff --git a/include/asm-sparc/linux_logo.h b/include/asm-sparc/linux_logo.h index a8b8ff1b4..2d400d9fd 100644 --- a/include/asm-sparc/linux_logo.h +++ b/include/asm-sparc/linux_logo.h @@ -1,9 +1,9 @@ -/* $Id: linux_logo.h,v 1.1 1997/04/16 17:51:24 jj Exp $ +/* $Id: linux_logo.h,v 1.5 1998/07/30 16:30:40 jj Exp $ * include/asm-sparc/linux_logo.h: This is a linux logo * to be displayed on boot. * * Copyright (C) 1996 Larry Ewing (lewing@isc.tamu.edu) - * Copyright (C) 1996 Jakub Jelinek (jj@sunsite.mff.cuni.cz) + * Copyright (C) 1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) * * You can put anything here, but: * LINUX_LOGO_COLORS has to be less than 224 @@ -23,902 +23,904 @@ #define linux_logo_banner "Linux/SPARC version " UTS_RELEASE -#define LINUX_LOGO_COLORS 221 +#define LINUX_LOGO_COLORS 219 + +#ifdef INCLUDE_LINUX_LOGO_DATA unsigned char linux_logo_red[] __initdata = { - 0xF3, 0xF6, 0xF8, 0xF7, 0xEF, 0xE7, 0xE5, 0xE3, - 0xCA, 0xD4, 0xDD, 0xC8, 0xC7, 0xC4, 0xC2, 0xE5, - 0xF1, 0xED, 0xEE, 0xE6, 0xC6, 0xDA, 0xDD, 0xE5, - 0xD9, 0xC6, 0xE3, 0xD0, 0xC6, 0xBA, 0xB0, 0xB6, - 0xBB, 0xBE, 0xB9, 0xB8, 0xB3, 0xB2, 0xB0, 0xAD, - 0xAC, 0xA9, 0xA8, 0xA6, 0xA4, 0xA1, 0xA0, 0x9D, - 0xA0, 0x9F, 0x9E, 0x9C, 0x9B, 0x99, 0x9A, 0x99, - 0x98, 0x95, 0x96, 0x94, 0x93, 0x92, 0x8F, 0x8D, - 0x8C, 0x8A, 0x87, 0x86, 0x83, 0x81, 0x0D, 0x03, - 0x66, 0x44, 0x24, 0x08, 0xD6, 0xE6, 0xE9, 0xE6, - 0xE7, 0xCA, 0xDC, 0xDB, 0xD5, 0xD0, 0xC9, 0xE2, - 0xD5, 0xC6, 0xC4, 0xB3, 0xB2, 0xB9, 0xA9, 0x9A, - 0xB2, 0x9D, 0xE8, 0xEC, 0xF5, 0xF5, 0xF4, 0xF4, - 0xEC, 0xEE, 0xF0, 0xF5, 0xE0, 0xD6, 0xC5, 0xC2, - 0xD9, 0xD5, 0xD8, 0xD6, 0xF6, 0xF4, 0xED, 0xEC, - 0xEB, 0xF1, 0xF6, 0xF5, 0xF5, 0xEE, 0xEF, 0xEC, - 0xE7, 0xE3, 0xE6, 0xD6, 0xDD, 0xC3, 0xD6, 0xD7, - 0xCD, 0xCA, 0xC3, 0xAC, 0x95, 0x99, 0xB7, 0xA3, - 0x8B, 0x88, 0x95, 0x8A, 0x94, 0xD2, 0xCC, 0xC4, - 0xA8, 0x8E, 0x8F, 0xAE, 0xB8, 0xAC, 0xB6, 0xB4, - 0xAD, 0xA5, 0xA0, 0x9B, 0x8B, 0xA3, 0x94, 0x87, - 0x85, 0x89, 0x53, 0x80, 0x7D, 0x7C, 0x7A, 0x78, - 0x76, 0x71, 0x73, 0x6E, 0x6B, 0x67, 0x65, 0x62, - 0x4B, 0x5B, 0x5F, 0x53, 0x56, 0x52, 0x4F, 0x46, - 0x42, 0x0F, 0x75, 0x78, 0x7D, 0x72, 0x5F, 0x6E, - 0x7A, 0x75, 0x6A, 0x58, 0x48, 0x4F, 0x00, 0x2B, - 0x37, 0x3E, 0x32, 0x33, 0x25, 0x2C, 0x3B, 0x11, - 0x1D, 0x14, 0x06, 0x02, 0x00 + 0x03, 0x9E, 0xEC, 0xEE, 0xC4, 0xDA, 0x50, 0xC9, + 0xC5, 0xED, 0x65, 0xE3, 0xE3, 0xF4, 0x24, 0xA4, + 0xEC, 0xEE, 0x94, 0xE5, 0xE3, 0x6A, 0xA6, 0xC4, + 0xDC, 0xE5, 0x13, 0xF3, 0xD1, 0xFD, 0xE2, 0xDB, + 0xA0, 0xC2, 0xEC, 0xB8, 0xC2, 0xD5, 0xF2, 0xF4, + 0xC5, 0x3E, 0xF1, 0x1B, 0x55, 0xF5, 0xCF, 0xF7, + 0xA9, 0xB4, 0xEB, 0x6C, 0x0A, 0x74, 0xB4, 0xF7, + 0xF0, 0xF5, 0xD4, 0xF2, 0xCE, 0xF5, 0xC7, 0x26, + 0x5B, 0xF4, 0xBC, 0x7F, 0xAB, 0x82, 0x94, 0xE5, + 0xFC, 0x3A, 0xF2, 0xFD, 0xF0, 0x1C, 0xEF, 0xD4, + 0xF3, 0x0F, 0xED, 0xF7, 0xC9, 0x49, 0xC3, 0xBA, + 0xC8, 0xD4, 0xE7, 0xF3, 0xF5, 0xA7, 0xEC, 0xF9, + 0xFA, 0x0A, 0xF5, 0xCF, 0xFC, 0xEA, 0xE1, 0xA6, + 0xD6, 0xBC, 0xF8, 0xF7, 0xB4, 0xEB, 0xDC, 0x84, + 0xCE, 0xBA, 0x45, 0xD6, 0x86, 0x50, 0x96, 0xC6, + 0x8C, 0x6E, 0xE8, 0x60, 0x3C, 0x70, 0xF0, 0x93, + 0x7C, 0xDA, 0xDA, 0x9C, 0xBA, 0x6D, 0x4D, 0x2B, + 0x2F, 0x8B, 0xE0, 0xCC, 0xDA, 0x5C, 0x3D, 0xEE, + 0xDB, 0x46, 0xAC, 0x96, 0xCE, 0xD1, 0xE3, 0xF1, + 0x96, 0x7A, 0x80, 0xB2, 0xBA, 0xB6, 0xD2, 0x1E, + 0x7E, 0xAA, 0xC4, 0xF0, 0x96, 0x65, 0x9E, 0xC2, + 0xAA, 0xF5, 0xF2, 0xE9, 0xE6, 0xD1, 0x35, 0xC7, + 0xF6, 0xB6, 0xE8, 0x82, 0xBE, 0xC2, 0xF2, 0x9E, + 0xC7, 0xB4, 0x0F, 0xF7, 0xE8, 0xD8, 0xCC, 0x9C, + 0xD8, 0xD8, 0xA0, 0xEA, 0xC6, 0xA8, 0xE0, 0xEC, + 0xD1, 0xF7, 0xF4, 0xFC, 0x75, 0xBD, 0xDC, 0xDD, + 0xCC, 0xE1, 0xFA, 0xEE, 0xAA, 0xEC, 0xF2, 0xB8, + 0xE2, 0xCD, 0x87 }; unsigned char linux_logo_green[] __initdata = { - 0xF3, 0xF6, 0xF8, 0xF7, 0xEF, 0xE7, 0xE5, 0xE3, - 0xCA, 0xD4, 0xDD, 0xC8, 0xC7, 0xC4, 0xC2, 0xD3, - 0xDA, 0xD4, 0xD7, 0xCC, 0xC1, 0xCC, 0xCB, 0xC9, - 0xC5, 0xBC, 0xBC, 0xBB, 0xB7, 0xA5, 0xB0, 0xB6, - 0xBB, 0xBE, 0xB9, 0xB8, 0xB3, 0xB2, 0xAD, 0xAD, - 0xAC, 0xA9, 0xA8, 0xA6, 0xA4, 0xA1, 0xA0, 0x95, - 0xA0, 0x9F, 0x9E, 0x9C, 0x9B, 0x99, 0x9A, 0x99, - 0x98, 0x95, 0x96, 0x94, 0x93, 0x92, 0x8F, 0x8D, - 0x8C, 0x8A, 0x87, 0x86, 0x83, 0x81, 0x08, 0x02, - 0x53, 0x2E, 0x19, 0x06, 0xC6, 0xC8, 0xCF, 0xBD, - 0xB3, 0xB6, 0xB4, 0xAB, 0xA5, 0xA3, 0x9B, 0xB6, - 0xA7, 0x99, 0x92, 0xA4, 0x9E, 0x9D, 0x98, 0x8C, - 0x8A, 0x86, 0xCD, 0xCC, 0xC9, 0xD7, 0xCA, 0xC4, - 0xCA, 0xC3, 0xC7, 0xC3, 0xC8, 0xB4, 0x91, 0x8E, - 0x8A, 0x82, 0x87, 0x85, 0xBD, 0xBF, 0xB6, 0xBC, - 0xAE, 0xB7, 0xBC, 0xB8, 0xBF, 0xB6, 0xBC, 0xB5, - 0xAB, 0xA6, 0xAD, 0xB2, 0xA5, 0x87, 0x9C, 0x96, - 0x95, 0x8E, 0x87, 0x8F, 0x86, 0x86, 0x8E, 0x80, - 0x7A, 0x70, 0x7B, 0x78, 0x78, 0x7F, 0x77, 0x6F, - 0x70, 0x76, 0x59, 0x77, 0x68, 0x64, 0x7B, 0x7C, - 0x75, 0x6D, 0x77, 0x69, 0x65, 0x5F, 0x5B, 0x54, - 0x4F, 0x5B, 0x39, 0x80, 0x7D, 0x7C, 0x7A, 0x78, - 0x76, 0x71, 0x73, 0x6E, 0x6B, 0x67, 0x65, 0x62, - 0x4B, 0x5B, 0x5F, 0x53, 0x56, 0x52, 0x4F, 0x46, - 0x42, 0x0B, 0x69, 0x66, 0x64, 0x57, 0x4A, 0x4E, - 0x55, 0x4B, 0x46, 0x3B, 0x30, 0x33, 0x00, 0x2B, - 0x37, 0x3E, 0x32, 0x33, 0x25, 0x2C, 0x29, 0x0D, - 0x1D, 0x14, 0x06, 0x02, 0x00 + 0x03, 0x88, 0xC4, 0xE2, 0x85, 0xC2, 0x44, 0xA3, + 0xA9, 0xD3, 0x65, 0xA6, 0xC5, 0xF3, 0x24, 0xA4, + 0xB4, 0xD6, 0x63, 0xD5, 0xB7, 0x44, 0x86, 0x94, + 0xC2, 0xE4, 0x14, 0xB6, 0xD2, 0xFB, 0xD4, 0xB2, + 0x73, 0x96, 0xDB, 0x92, 0xC2, 0x95, 0xC2, 0xDA, + 0xA4, 0x36, 0xD4, 0x0E, 0x55, 0xF4, 0xC4, 0xE9, + 0x75, 0xB4, 0xBC, 0x52, 0x0A, 0x74, 0x84, 0xEB, + 0xDC, 0xDA, 0xA2, 0xD6, 0x9B, 0xBD, 0xB7, 0x12, + 0x44, 0xCA, 0x8C, 0x65, 0x7B, 0x54, 0x94, 0xAB, + 0xF4, 0x25, 0xC4, 0xFD, 0xE4, 0x1C, 0xDD, 0xAB, + 0xBD, 0x06, 0xCB, 0xD6, 0xCA, 0x33, 0x8C, 0xA2, + 0x92, 0x9C, 0xBC, 0xDB, 0xCD, 0x6E, 0xEC, 0xEE, + 0xBC, 0x03, 0xDA, 0xCE, 0xF4, 0xB6, 0xDB, 0x92, + 0xAD, 0xBC, 0xDE, 0xD5, 0x7B, 0xAE, 0x9D, 0x84, + 0xB6, 0x96, 0x44, 0xBA, 0x6E, 0x3C, 0x7A, 0xB2, + 0x8C, 0x4C, 0xCE, 0x4C, 0x3C, 0x5A, 0xCA, 0x6D, + 0x7C, 0xCE, 0xDA, 0x9C, 0xAA, 0x6D, 0x4D, 0x2B, + 0x1B, 0x5E, 0xCB, 0xAC, 0xBE, 0x5C, 0x2E, 0xDC, + 0xBD, 0x3E, 0xAC, 0x82, 0xB6, 0xBE, 0xD3, 0xBD, + 0x72, 0x62, 0x6C, 0x82, 0x92, 0x9E, 0xB0, 0x13, + 0x4A, 0x8E, 0xBE, 0xCE, 0x86, 0x45, 0x6B, 0xAA, + 0x9A, 0xC5, 0xC6, 0xDA, 0xC5, 0xC4, 0x34, 0x9B, + 0xCC, 0xAC, 0xC4, 0x76, 0x9A, 0x9E, 0xEE, 0x62, + 0xC6, 0x76, 0x0D, 0xE4, 0xDA, 0xD5, 0xA5, 0x92, + 0xCD, 0xB2, 0x7C, 0xCC, 0xBE, 0x7E, 0xDC, 0xD6, + 0xB9, 0xE3, 0xD4, 0xF6, 0x55, 0x82, 0xA4, 0xAA, + 0x8D, 0xBB, 0xCE, 0xD5, 0x8A, 0xDB, 0xD4, 0x8B, + 0xCA, 0x93, 0x63 }; unsigned char linux_logo_blue[] __initdata = { - 0xF3, 0xF6, 0xF8, 0xF7, 0xEF, 0xEE, 0xE5, 0xDE, - 0xD7, 0xD3, 0xDD, 0xC8, 0xC7, 0xC4, 0xC2, 0xB5, - 0xB0, 0xA6, 0xAC, 0x9B, 0xB5, 0xB5, 0xAE, 0x84, - 0x90, 0xA9, 0x81, 0x8D, 0x96, 0x86, 0xB0, 0xB6, - 0xBB, 0xBE, 0xB9, 0xB8, 0xB3, 0xB2, 0xA7, 0xAD, - 0xAC, 0xA9, 0xA8, 0xA6, 0xA4, 0xA1, 0xA5, 0x87, - 0xA0, 0x9F, 0x9E, 0x9C, 0x9B, 0x9A, 0x9A, 0x99, - 0x98, 0x95, 0x96, 0x94, 0x93, 0x92, 0x8F, 0x8D, - 0x8C, 0x8A, 0x87, 0x86, 0x83, 0x81, 0xC8, 0xD7, - 0x9B, 0x8E, 0x8C, 0xB2, 0x77, 0x77, 0x4E, 0x77, - 0x69, 0x71, 0x78, 0x6B, 0x65, 0x66, 0x64, 0x59, - 0x5C, 0x5A, 0x48, 0x72, 0x7B, 0x6B, 0x67, 0x6E, - 0x42, 0x5B, 0x29, 0x36, 0x25, 0x10, 0x17, 0x14, - 0x19, 0x16, 0x13, 0x0E, 0x08, 0x2E, 0x2E, 0x3D, - 0x24, 0x24, 0x24, 0x24, 0x13, 0x12, 0x14, 0x14, - 0x0E, 0x08, 0x0D, 0x0F, 0x08, 0x0D, 0x0E, 0x08, - 0x08, 0x0C, 0x06, 0x06, 0x07, 0x16, 0x07, 0x0E, - 0x08, 0x0A, 0x07, 0x0D, 0x2D, 0x3E, 0x09, 0x4E, - 0x68, 0x52, 0x56, 0x58, 0x4B, 0x22, 0x20, 0x20, - 0x27, 0x39, 0x28, 0x19, 0x1E, 0x1E, 0x08, 0x06, - 0x07, 0x09, 0x08, 0x08, 0x05, 0x1D, 0x1F, 0x17, - 0x18, 0x06, 0x79, 0x80, 0x7D, 0x7C, 0x7A, 0x78, - 0x76, 0x71, 0x73, 0x6E, 0x6B, 0x68, 0x65, 0x62, - 0x4B, 0x5B, 0x5F, 0x55, 0x56, 0x52, 0x4F, 0x46, - 0x42, 0x5A, 0x14, 0x23, 0x3D, 0x2B, 0x21, 0x14, - 0x06, 0x04, 0x03, 0x07, 0x09, 0x13, 0x2A, 0x3A, - 0x37, 0x3E, 0x32, 0x33, 0x25, 0x2C, 0x07, 0x09, - 0x1D, 0x14, 0x06, 0x02, 0x00 + 0x04, 0x28, 0x10, 0x8C, 0x0B, 0x84, 0x14, 0x1A, + 0x77, 0x1F, 0x64, 0x0E, 0x85, 0xD2, 0x24, 0xA4, + 0x0F, 0x54, 0x0C, 0x7C, 0x3F, 0x04, 0x20, 0x0D, + 0x54, 0xDF, 0x14, 0x0D, 0xD1, 0xE9, 0xB0, 0x11, + 0x0A, 0x40, 0x57, 0x14, 0xC3, 0x0C, 0x04, 0x12, + 0x50, 0x0C, 0x7D, 0x05, 0x55, 0xF2, 0xBA, 0xC7, + 0x09, 0xB4, 0x0E, 0x24, 0x0B, 0x74, 0x0C, 0xB6, + 0x80, 0x48, 0x10, 0x34, 0x0F, 0x0C, 0xA0, 0x04, + 0x19, 0x10, 0x0E, 0x14, 0x0E, 0x05, 0x94, 0x0E, + 0xCA, 0x0B, 0x46, 0xFB, 0xB4, 0x1C, 0x9B, 0x1A, + 0x21, 0x09, 0x14, 0x4D, 0xCB, 0x08, 0x11, 0x7C, + 0x20, 0x10, 0x24, 0x66, 0x79, 0x07, 0xEA, 0xC9, + 0x0C, 0x08, 0x38, 0xC4, 0xD8, 0x24, 0xBE, 0x6C, + 0x51, 0xBB, 0x8C, 0x36, 0x0A, 0x0F, 0x0C, 0x84, + 0x3C, 0x54, 0x44, 0x7C, 0x28, 0x0E, 0x28, 0x7F, + 0x8C, 0x0F, 0x54, 0x24, 0x3C, 0x18, 0x54, 0x17, + 0x7C, 0x9C, 0xDA, 0x9C, 0x7C, 0x6C, 0x4D, 0x2C, + 0x09, 0x0E, 0x8A, 0x50, 0x4C, 0x5B, 0x14, 0xAC, + 0x19, 0x3C, 0xAC, 0x5C, 0x64, 0x97, 0x94, 0x37, + 0x29, 0x3C, 0x44, 0x3C, 0x2C, 0x7C, 0x70, 0x07, + 0x04, 0x29, 0xB2, 0x64, 0x74, 0x07, 0x07, 0x2C, + 0x74, 0x2E, 0x6C, 0xA4, 0x29, 0x9E, 0x34, 0x27, + 0x2F, 0x98, 0x48, 0x5C, 0x0C, 0x5C, 0xE8, 0x04, + 0xC2, 0x0C, 0x0A, 0xB2, 0x74, 0xCB, 0x46, 0x78, + 0xB4, 0x5C, 0x18, 0x80, 0x8C, 0x24, 0xD9, 0xAC, + 0x87, 0x99, 0x1D, 0xE8, 0x14, 0x0D, 0x10, 0x17, + 0x0A, 0x67, 0x3C, 0x68, 0x3C, 0x69, 0x90, 0x22, + 0x6C, 0x0D, 0x17 }; unsigned char linux_logo[] __initdata = { - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x58, 0x57, - 0x58, 0x58, 0x59, 0x5C, 0x5D, 0x5F, 0x60, 0x61, - 0x62, 0x61, 0x61, 0x62, 0x62, 0x62, 0x63, 0x63, - 0x61, 0x61, 0x61, 0x61, 0x61, 0x60, 0x5E, 0x5E, - 0x5E, 0x5D, 0x5D, 0x5C, 0x5D, 0x5B, 0x58, 0x58, - 0x58, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x58, - 0x57, 0x57, 0x58, 0x57, 0x57, 0x58, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x58, 0x57, - 0x54, 0x56, 0x57, 0x67, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0x67, 0x4C, - 0x4A, 0x49, 0x4A, 0x49, 0x4A, 0x49, 0x49, 0x4A, - 0x4A, 0x4B, 0x4B, 0x4B, 0x4C, 0x50, 0x51, 0x52, - 0x54, 0x54, 0x56, 0x57, 0x57, 0x57, 0x57, 0x58, - 0x57, 0x57, 0x58, 0x57, 0x57, 0x58, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x58, 0x56, 0x56, 0x53, - 0x52, 0x53, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFB, 0xFB, 0xFB, - 0x4B, 0x4B, 0x4B, 0x4A, 0x49, 0x4A, 0x4A, 0x49, - 0x49, 0x49, 0x48, 0x49, 0x49, 0x4A, 0x4A, 0x4B, - 0x4C, 0x4D, 0x52, 0x54, 0x56, 0x55, 0x57, 0x58, - 0x57, 0x57, 0x58, 0x57, 0x57, 0x58, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x55, 0x54, 0x53, 0x52, 0x51, 0x50, - 0x50, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xF8, 0xF0, 0xF4, 0xFB, - 0xFC, 0x67, 0x53, 0x50, 0x4D, 0x4C, 0x4C, 0x4C, - 0x4B, 0x4A, 0x4A, 0x48, 0x49, 0x48, 0x48, 0x49, - 0x49, 0x49, 0x4B, 0x4C, 0x50, 0x52, 0x53, 0x56, - 0x57, 0x57, 0x58, 0x57, 0x57, 0x58, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x55, 0x54, 0x53, 0x51, 0x51, 0x50, 0x4C, 0x4D, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xF4, 0xD2, 0xD7, 0xF5, - 0xFC, 0xFC, 0x5D, 0x5D, 0x5C, 0x5C, 0x59, 0x58, - 0x58, 0x56, 0x52, 0x4C, 0x4B, 0x4A, 0x4A, 0x48, - 0x48, 0x48, 0x48, 0x48, 0x49, 0x4B, 0x4D, 0x51, - 0x54, 0x56, 0x58, 0x57, 0x57, 0x58, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x55, 0x54, - 0x53, 0x52, 0x51, 0x4D, 0x4D, 0x4D, 0x50, 0x50, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xF4, 0x64, 0xD9, 0xF5, - 0xF9, 0xFC, 0xFC, 0x64, 0x63, 0x62, 0x61, 0x61, - 0x61, 0x60, 0x5E, 0x5B, 0x5A, 0x54, 0x52, 0x4C, - 0x4B, 0x49, 0x49, 0x47, 0x47, 0x48, 0x49, 0x4B, - 0x4C, 0x51, 0x53, 0x56, 0x57, 0x58, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x58, 0x57, 0x57, 0x55, 0x53, 0x53, - 0x51, 0x50, 0x50, 0x50, 0x50, 0x50, 0x53, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xF4, 0xF5, 0xF9, 0xFC, - 0xFC, 0xFC, 0xFC, 0x64, 0x64, 0x64, 0x64, 0x64, - 0x64, 0x64, 0x64, 0x63, 0x61, 0x61, 0x5E, 0x59, - 0x55, 0x52, 0x4C, 0x4A, 0x49, 0x47, 0x48, 0x48, - 0x49, 0x4B, 0x4D, 0x51, 0x54, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x58, 0x55, 0x54, 0x54, 0x52, 0x51, - 0x51, 0x51, 0x51, 0x51, 0x53, 0x54, 0x59, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xF7, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0x60, 0x60, 0x60, 0x61, - 0x62, 0x63, 0x64, 0x64, 0x65, 0x65, 0x64, 0x63, - 0x61, 0x5E, 0x59, 0x56, 0x4D, 0x4B, 0x48, 0x48, - 0x48, 0x48, 0x49, 0x4B, 0x50, 0x53, 0x56, 0x56, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x56, 0x54, 0x53, 0x52, 0x51, 0x51, - 0x51, 0x52, 0x53, 0x55, 0x59, 0x5D, 0x5E, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFB, 0xFB, 0xFB, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0x4C, 0x4E, 0x51, 0x52, - 0x57, 0x5A, 0x5E, 0x60, 0x61, 0x63, 0x65, 0xCB, - 0x64, 0x64, 0x63, 0x60, 0x5C, 0x57, 0x50, 0x4B, - 0x48, 0x47, 0x47, 0x47, 0x4A, 0x4C, 0x52, 0x53, - 0x54, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x55, 0x54, 0x53, 0x53, 0x51, 0x52, 0x52, 0x53, - 0x53, 0x57, 0x5A, 0x5D, 0x5E, 0x5E, 0x60, 0xFC, - 0xFC, 0xFC, 0xFB, 0xF9, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFA, 0xF9, 0xF5, 0xFB, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFB, 0x45, 0x3F, 0x3F, - 0x45, 0x48, 0x4B, 0x4D, 0x54, 0x5A, 0x5E, 0x61, - 0x63, 0xCB, 0xCB, 0x65, 0x64, 0x62, 0x5E, 0x57, - 0x50, 0x4B, 0x48, 0x47, 0x47, 0x48, 0x4B, 0x4D, - 0x51, 0x56, 0x56, 0x57, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x55, - 0x54, 0x54, 0x53, 0x53, 0x52, 0x53, 0x54, 0x57, - 0x59, 0x5C, 0x5E, 0x5E, 0x5E, 0x5E, 0x5E, 0xFC, - 0xFC, 0xFA, 0xFC, 0xFA, 0xE0, 0xFC, 0xFC, 0xFC, - 0xFB, 0xFB, 0xFB, 0xDF, 0xD8, 0xF9, 0xE0, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFB, 0x4C, 0x4A, 0x48, - 0x48, 0x3E, 0x44, 0x43, 0x3F, 0x47, 0x4B, 0x52, - 0x5A, 0x5E, 0x62, 0x64, 0xCB, 0xCB, 0x64, 0x61, - 0x5E, 0x57, 0x4D, 0x49, 0x47, 0x47, 0x48, 0x4A, - 0x4C, 0x52, 0x54, 0x56, 0x57, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x55, - 0x54, 0x53, 0x53, 0x54, 0x54, 0x55, 0x58, 0x5B, - 0x5C, 0x5D, 0x5E, 0x5D, 0x5D, 0x5B, 0x58, 0xFC, - 0xFC, 0xD8, 0x4C, 0x60, 0xFC, 0xF5, 0xFC, 0xFC, - 0xFC, 0xF7, 0x5F, 0x48, 0x48, 0x2C, 0xF8, 0xF9, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0x4B, 0x4A, 0x49, - 0x49, 0x49, 0x49, 0x47, 0x3E, 0x44, 0x42, 0x3F, - 0x3E, 0x4B, 0x54, 0x5C, 0x61, 0x64, 0xCB, 0xCB, - 0x64, 0x61, 0x5D, 0x53, 0x4B, 0x49, 0x47, 0x47, - 0x49, 0x4B, 0x50, 0x53, 0x56, 0x57, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x57, 0x55, 0x55, 0x54, - 0x53, 0x53, 0x54, 0x56, 0x58, 0x5A, 0x5B, 0x5D, - 0x5D, 0x5D, 0x5C, 0x5A, 0x54, 0x52, 0x4C, 0xFC, - 0xF7, 0x4E, 0x2D, 0x29, 0x4E, 0xFC, 0xFC, 0xFC, - 0xFB, 0x5F, 0x26, 0x24, 0x20, 0x2E, 0x65, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0x45, 0x3F, 0x45, - 0x3E, 0x47, 0x47, 0x47, 0x47, 0x47, 0x3E, 0x44, - 0x43, 0x40, 0x44, 0x49, 0x51, 0x5C, 0x62, 0x64, - 0xCB, 0xCB, 0x63, 0x60, 0x58, 0x50, 0x49, 0x48, - 0x48, 0x48, 0x4A, 0x4D, 0x53, 0x54, 0x57, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x55, 0x54, 0x54, 0x54, - 0x54, 0x54, 0x55, 0x57, 0x59, 0x5B, 0x5C, 0x5D, - 0x5C, 0x5A, 0x54, 0x51, 0x4C, 0x4C, 0x54, 0xFC, - 0xF9, 0x23, 0xDB, 0x2D, 0x23, 0xFA, 0xFB, 0xFA, - 0xF5, 0x27, 0x21, 0xD9, 0xF8, 0x20, 0x21, 0xFB, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0x5D, 0x58, 0x55, - 0x50, 0x48, 0x45, 0x43, 0x44, 0x44, 0x45, 0x45, - 0x3E, 0x3F, 0x43, 0x41, 0x3F, 0x48, 0x52, 0x5D, - 0x63, 0x65, 0xCB, 0x65, 0x61, 0x5D, 0x52, 0x4B, - 0x48, 0x47, 0x47, 0x49, 0x4C, 0x51, 0x54, 0x57, - 0x57, 0x57, 0x57, 0x57, 0x55, 0x54, 0x54, 0x54, - 0x54, 0x58, 0x5A, 0x59, 0x5B, 0x5B, 0x5B, 0x5A, - 0x55, 0x52, 0x4D, 0x4D, 0x55, 0x5B, 0x5D, 0xFC, - 0xF1, 0xF9, 0xFC, 0xD4, 0x21, 0xCC, 0xF7, 0xF8, - 0xF2, 0x21, 0xD9, 0xFC, 0xF2, 0xFB, 0x21, 0x45, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFB, 0xD1, 0xD0, 0xCD, - 0xCC, 0x63, 0x5E, 0x58, 0x50, 0x47, 0x43, 0x3F, - 0x3F, 0x3F, 0x3F, 0x3F, 0x40, 0x41, 0x3F, 0x4A, - 0x56, 0x5E, 0x64, 0xCB, 0x65, 0x63, 0x5E, 0x56, - 0x4C, 0x48, 0x47, 0x47, 0x49, 0x4C, 0x51, 0x54, - 0x58, 0x57, 0x57, 0x57, 0x57, 0x55, 0x54, 0x54, - 0x57, 0x5A, 0x5A, 0x5C, 0x5B, 0x5A, 0x58, 0x54, - 0x51, 0x4C, 0x55, 0x5D, 0x5D, 0x5B, 0x54, 0xFC, - 0xF0, 0xF9, 0xFC, 0x65, 0x45, 0xCD, 0xFB, 0xFB, - 0xF8, 0x26, 0xFB, 0xFC, 0xFC, 0xFC, 0x21, 0x27, - 0xFB, 0xFC, 0xFC, 0xFC, 0xFB, 0xD7, 0x35, 0x34, - 0x2F, 0x35, 0x36, 0x2F, 0x2F, 0x36, 0x2F, 0x2F, - 0x36, 0x36, 0x35, 0x35, 0x43, 0x42, 0x41, 0x2E, - 0x45, 0x4C, 0x5B, 0x62, 0x65, 0xCC, 0x64, 0x60, - 0x58, 0x4D, 0x49, 0x47, 0x47, 0x49, 0x4C, 0x51, - 0x58, 0x57, 0x57, 0x57, 0x57, 0x57, 0x55, 0x57, - 0x58, 0x5A, 0x5A, 0x5B, 0x5A, 0x55, 0x54, 0x51, - 0x53, 0x5C, 0x5D, 0x5D, 0x54, 0x4B, 0x4D, 0xFC, - 0xFC, 0x44, 0xFC, 0xFB, 0x7B, 0xAB, 0xA8, 0xAE, - 0xAB, 0x7F, 0xFC, 0xFC, 0xFB, 0xFB, 0x22, 0x2A, - 0xFC, 0xFC, 0xFC, 0xFC, 0x36, 0x2F, 0x30, 0x30, - 0x32, 0x30, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x2F, 0x2F, 0x40, 0x41, - 0x2E, 0x40, 0x48, 0x56, 0x5F, 0x64, 0xCC, 0x65, - 0x61, 0x59, 0x50, 0x49, 0x47, 0x47, 0x49, 0x4C, - 0x5A, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x58, - 0x5A, 0x5A, 0x5A, 0x58, 0x55, 0x52, 0x51, 0x5A, - 0x5D, 0x5D, 0x57, 0x4C, 0x51, 0x54, 0x5D, 0xFC, - 0xFC, 0x2A, 0xFC, 0xC9, 0xAA, 0x8B, 0x8A, 0x8C, - 0xAB, 0x8C, 0x8C, 0xFB, 0xFB, 0x23, 0x20, 0xF1, - 0xFC, 0xFC, 0xFC, 0x3B, 0x33, 0x33, 0x32, 0x32, - 0x31, 0x32, 0x30, 0x32, 0x32, 0x32, 0x32, 0x30, - 0x31, 0x31, 0x31, 0x32, 0x33, 0x33, 0x3C, 0x41, - 0x41, 0x2E, 0x2D, 0x45, 0x4D, 0x5D, 0x63, 0xCC, - 0x65, 0x62, 0x5D, 0x51, 0x49, 0x47, 0x47, 0x4A, - 0x59, 0x57, 0x57, 0x57, 0x57, 0x58, 0x58, 0x58, - 0x5A, 0x5A, 0x58, 0x55, 0x53, 0x53, 0x5C, 0x5E, - 0x59, 0x51, 0x4E, 0x54, 0x59, 0x5E, 0x62, 0xFC, - 0xFC, 0xDB, 0xAA, 0xA1, 0x95, 0x9C, 0x8C, 0x88, - 0x82, 0x83, 0x83, 0x8C, 0x88, 0xAE, 0xB9, 0xFB, - 0xFC, 0xFC, 0xFC, 0x3C, 0x3B, 0x72, 0x38, 0x33, - 0x33, 0x33, 0x31, 0x33, 0x31, 0x31, 0x31, 0x31, - 0x33, 0x33, 0x38, 0x33, 0x72, 0x3B, 0x44, 0x2E, - 0x41, 0x2E, 0x2E, 0x2D, 0x43, 0x4B, 0x5B, 0x63, - 0xCB, 0xCC, 0x63, 0x5D, 0x51, 0x49, 0x47, 0x49, - 0x5C, 0x58, 0x57, 0x57, 0x57, 0x57, 0x58, 0x58, - 0x58, 0x58, 0x57, 0x53, 0x58, 0x5D, 0x5E, 0x55, - 0x51, 0x53, 0x58, 0x5E, 0x60, 0x63, 0x64, 0xFC, - 0xFC, 0xC0, 0xA6, 0x9D, 0x8B, 0x9C, 0x8C, 0x8C, - 0x6E, 0x83, 0x88, 0x8C, 0x8C, 0x8C, 0x83, 0xE8, - 0xFB, 0xFC, 0xFC, 0xFC, 0x33, 0x70, 0x70, 0x6F, - 0x6F, 0x6F, 0x6F, 0x3A, 0x6F, 0x6D, 0x6F, 0x6F, - 0x70, 0x6F, 0x6F, 0x70, 0x6F, 0x32, 0x5A, 0x48, - 0x41, 0x2D, 0x2D, 0x2D, 0x2C, 0x41, 0x49, 0x5A, - 0x62, 0xCB, 0xCB, 0x63, 0x5D, 0x50, 0x49, 0x4A, - 0x5C, 0x58, 0x58, 0x57, 0x55, 0x57, 0x57, 0x57, - 0x57, 0x55, 0x56, 0x59, 0x5E, 0x5C, 0x52, 0x53, - 0x55, 0x5B, 0x5E, 0x61, 0x63, 0x64, 0x63, 0xFC, - 0xE8, 0xBF, 0xA4, 0x99, 0x9C, 0x8C, 0x88, 0x88, - 0x6E, 0x88, 0x8C, 0x8C, 0x8C, 0xC2, 0xA6, 0xC4, - 0xFC, 0xFC, 0xFC, 0xFC, 0x36, 0x3A, 0x6F, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, - 0x70, 0x70, 0x70, 0x70, 0x37, 0x32, 0xCD, 0x5E, - 0x4C, 0x43, 0x2C, 0x2D, 0x2D, 0x2C, 0x2E, 0x47, - 0x57, 0x61, 0x65, 0xCC, 0x63, 0x5C, 0x50, 0x4D, - 0x5C, 0x5A, 0x57, 0x55, 0x55, 0x55, 0x58, 0x58, - 0x55, 0x54, 0x5B, 0x5E, 0x5D, 0x53, 0x53, 0x55, - 0x5D, 0x5E, 0x61, 0x61, 0x61, 0x61, 0x5E, 0xFC, - 0xEA, 0xBE, 0xA4, 0x9B, 0x8B, 0x85, 0x8C, 0x6E, - 0x8C, 0x8C, 0x8C, 0xA3, 0xAA, 0xA4, 0xA4, 0xE9, - 0xFB, 0xFC, 0xFC, 0xFC, 0x36, 0x6D, 0x70, 0x73, - 0x70, 0x70, 0x70, 0x73, 0x73, 0x73, 0x73, 0x70, - 0x70, 0x70, 0x73, 0x70, 0x37, 0x38, 0xD1, 0xCF, - 0x61, 0x4D, 0x44, 0x2C, 0x2D, 0x2E, 0x2C, 0x2E, - 0x3E, 0x56, 0x61, 0xCB, 0xCC, 0x62, 0x5B, 0x57, - 0x59, 0x58, 0x55, 0x54, 0x54, 0x55, 0x58, 0x58, - 0x58, 0x5B, 0x5E, 0x5B, 0x53, 0x55, 0x55, 0x5C, - 0x5E, 0x61, 0x61, 0x60, 0x5D, 0x5A, 0x4E, 0xFC, - 0xFC, 0xEA, 0xAA, 0x9C, 0x8A, 0x85, 0x82, 0x8C, - 0x8C, 0xA8, 0xEB, 0xA8, 0xA4, 0xA4, 0xAA, 0xFC, - 0xFC, 0xFC, 0x64, 0xFB, 0x39, 0x31, 0x72, 0x78, - 0x73, 0x78, 0x73, 0x74, 0x74, 0x74, 0x74, 0x73, - 0x78, 0x70, 0x73, 0x73, 0x33, 0xCC, 0xD2, 0xD1, - 0xCE, 0x62, 0x53, 0x3F, 0x2D, 0x2D, 0x41, 0x2C, - 0x2E, 0x3E, 0x56, 0x62, 0xCB, 0xCB, 0x61, 0x5D, - 0x54, 0x54, 0x54, 0x54, 0x56, 0x58, 0x58, 0x58, - 0x5C, 0x5E, 0x5A, 0x55, 0x58, 0x58, 0x5B, 0x5E, - 0x61, 0x5E, 0x5D, 0x5A, 0x52, 0x55, 0xCD, 0xFC, - 0xFC, 0x34, 0xC9, 0xE8, 0xA8, 0xAE, 0xC2, 0xE8, - 0xC3, 0xA6, 0xA7, 0xA6, 0xAA, 0x78, 0x2E, 0x42, - 0xFC, 0xFC, 0xD2, 0x64, 0xF8, 0x31, 0x72, 0x73, - 0x73, 0x73, 0x73, 0x74, 0x75, 0x75, 0x74, 0x73, - 0x73, 0x73, 0x73, 0x72, 0x33, 0x5C, 0x64, 0xD2, - 0xD1, 0xCF, 0x63, 0x54, 0x3F, 0x2C, 0x41, 0x41, - 0x2C, 0x2E, 0x47, 0x58, 0x63, 0xCB, 0xCB, 0x62, - 0x52, 0x53, 0x53, 0x56, 0x58, 0x58, 0x5A, 0x5B, - 0x5E, 0x5A, 0x57, 0x58, 0x58, 0x58, 0x60, 0x60, - 0x5D, 0x5A, 0x55, 0x4E, 0x64, 0xD2, 0xD1, 0xFC, - 0xFC, 0x41, 0x3E, 0xC1, 0xC0, 0xA3, 0xA6, 0xA7, - 0xA7, 0xA9, 0xAA, 0xB8, 0x2E, 0x3F, 0x2C, 0x41, - 0xFC, 0xFC, 0xF7, 0xCE, 0xCD, 0x36, 0x72, 0x73, - 0x74, 0x75, 0x78, 0x75, 0x75, 0x75, 0x74, 0x74, - 0x74, 0x74, 0x78, 0x72, 0x6D, 0x49, 0x59, 0xCB, - 0xD1, 0xD1, 0xD2, 0xCB, 0x56, 0x3F, 0x2C, 0x41, - 0x40, 0x2D, 0x2E, 0x49, 0x5B, 0x64, 0xCC, 0x64, - 0x51, 0x53, 0x53, 0x55, 0x58, 0x59, 0x5B, 0x5E, - 0x59, 0x58, 0x58, 0x58, 0x55, 0x60, 0x60, 0x5C, - 0x5A, 0x53, 0x5B, 0xD0, 0xD3, 0xD3, 0xD3, 0xFB, - 0xFC, 0x40, 0x41, 0x45, 0xC4, 0xC0, 0xBE, 0xBE, - 0xC1, 0xC0, 0x3C, 0x47, 0x2E, 0x21, 0x22, 0x20, - 0x65, 0xFC, 0xFC, 0xFC, 0xFC, 0x6D, 0x72, 0x75, - 0x78, 0x76, 0x75, 0x79, 0x76, 0x76, 0x76, 0x76, - 0x75, 0x75, 0x75, 0x72, 0x6D, 0x2E, 0x48, 0x5D, - 0xCE, 0xD1, 0xD4, 0xD3, 0xCB, 0x56, 0x43, 0x2C, - 0x42, 0x43, 0x2E, 0x2E, 0x4A, 0x5D, 0x64, 0x64, - 0x50, 0x52, 0x56, 0x58, 0x5C, 0x5D, 0x5E, 0x5D, - 0x5A, 0x58, 0x58, 0x55, 0x61, 0x60, 0x58, 0x58, - 0x4E, 0x61, 0xD1, 0xD4, 0xD4, 0xD1, 0xEE, 0xFC, - 0xFC, 0x2B, 0x29, 0x2E, 0x3F, 0xB0, 0xAD, 0x81, - 0x46, 0x2D, 0x46, 0x2C, 0x24, 0x22, 0x22, 0x23, - 0x25, 0xFC, 0xFC, 0xFC, 0xFC, 0x6E, 0x73, 0x76, - 0x76, 0x79, 0x79, 0x79, 0x76, 0x76, 0x79, 0x76, - 0x79, 0x79, 0x79, 0x74, 0x3F, 0x41, 0x2C, 0x48, - 0x5F, 0xCF, 0xD5, 0xD7, 0xD6, 0xCD, 0x57, 0x40, - 0x2E, 0x3F, 0x44, 0x2E, 0x41, 0x4C, 0x60, 0x61, - 0x51, 0x53, 0x58, 0x5C, 0x5D, 0x5E, 0x5D, 0x5C, - 0x58, 0x57, 0x54, 0x5F, 0x5E, 0x55, 0x55, 0x52, - 0x64, 0xD4, 0xD5, 0xD4, 0xD1, 0x5D, 0xFA, 0xFB, - 0xF4, 0x21, 0x24, 0x41, 0x40, 0x44, 0x2E, 0x2E, - 0x42, 0x41, 0x2A, 0x24, 0x22, 0x22, 0x22, 0x22, - 0x23, 0xD9, 0xFC, 0xFC, 0xFC, 0xFC, 0xE5, 0xB8, - 0x8F, 0x8F, 0x7A, 0x8F, 0x7A, 0x8F, 0x7A, 0x8F, - 0x8F, 0x8F, 0xB8, 0xE5, 0x3F, 0x3E, 0x43, 0x2C, - 0x48, 0x61, 0xD1, 0xD7, 0xD9, 0xD7, 0xD0, 0x57, - 0x41, 0x2E, 0x3E, 0x44, 0x2D, 0x40, 0x52, 0x5D, - 0x53, 0x55, 0x59, 0x5D, 0x5E, 0x5E, 0x5D, 0x5A, - 0x57, 0x53, 0x5E, 0x5E, 0x54, 0x53, 0x54, 0x65, - 0xD5, 0xD6, 0xD4, 0xCE, 0x53, 0xFB, 0xF9, 0xFC, - 0x24, 0x22, 0x23, 0x23, 0x41, 0x42, 0x2E, 0x40, - 0x2B, 0x21, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x23, 0x23, 0xFC, 0xFC, 0xFC, 0xFC, 0xE7, 0xBD, - 0xB5, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, - 0x93, 0xB5, 0xC6, 0xEB, 0x2D, 0x47, 0x4A, 0x47, - 0x2C, 0x3E, 0x61, 0xD4, 0xDC, 0xDC, 0xDA, 0xCF, - 0x54, 0x41, 0x41, 0x3E, 0x45, 0x2C, 0x3F, 0x4A, - 0x58, 0x5A, 0x5C, 0x5F, 0x60, 0x5E, 0x5D, 0x57, - 0x51, 0x5D, 0x5D, 0x51, 0x53, 0x53, 0xCB, 0xD5, - 0xD6, 0xD5, 0x63, 0x55, 0xFC, 0xFC, 0xFC, 0x2C, - 0x23, 0x22, 0x23, 0x22, 0x20, 0x2D, 0x2C, 0x26, - 0x21, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x21, 0xF0, 0xFC, 0xFC, 0xFC, 0xE2, 0xC6, - 0xB5, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, - 0x93, 0x93, 0xC7, 0xE3, 0x3E, 0x2E, 0x49, 0x52, - 0x4C, 0x41, 0x44, 0x62, 0xD6, 0xDE, 0xDE, 0xD9, - 0xD0, 0x51, 0x2E, 0x40, 0x47, 0x44, 0x2C, 0x42, - 0x5D, 0x5D, 0x5F, 0x60, 0x60, 0x5D, 0x57, 0x51, - 0x58, 0x5D, 0x4E, 0x52, 0x55, 0x64, 0xD5, 0xD6, - 0xD4, 0x61, 0x59, 0x6B, 0xFC, 0xFC, 0xFC, 0x21, - 0x23, 0x22, 0x23, 0x22, 0x23, 0x21, 0x23, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x21, 0x24, 0xFC, 0xFC, 0xFC, 0xE2, 0xC7, - 0xB5, 0x90, 0x93, 0x93, 0x93, 0x90, 0x93, 0x93, - 0x90, 0xB5, 0xC8, 0xE4, 0x5F, 0x45, 0x2E, 0x4D, - 0x57, 0x57, 0x44, 0x43, 0x63, 0xDA, 0xDF, 0xDF, - 0xD9, 0xCE, 0x4C, 0x2C, 0x3F, 0x3E, 0x40, 0x40, - 0x60, 0x5E, 0x61, 0x61, 0x5E, 0x5B, 0x53, 0x52, - 0x5C, 0x52, 0x52, 0x55, 0x61, 0xD4, 0xD5, 0xD1, - 0x5E, 0x5B, 0x5C, 0xFB, 0xFC, 0xFC, 0x2A, 0x21, - 0x23, 0x22, 0x23, 0x22, 0x22, 0x22, 0x23, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0xFB, 0xFC, 0xFC, 0xB3, 0xC8, - 0xB5, 0x90, 0x92, 0xB5, 0x93, 0x93, 0xB5, 0x93, - 0x92, 0xB5, 0xC8, 0xB9, 0xD0, 0x5E, 0x44, 0x40, - 0x52, 0x58, 0x57, 0x48, 0x40, 0x63, 0xD9, 0xE0, - 0xE0, 0xD9, 0xCB, 0x49, 0x2D, 0x3F, 0x45, 0x3F, - 0x63, 0x61, 0x62, 0x60, 0x5E, 0x55, 0x4D, 0x59, - 0x53, 0x4E, 0x54, 0x5D, 0xD2, 0xD4, 0xD2, 0x5E, - 0x5C, 0x5D, 0xFC, 0xFC, 0xFC, 0xF8, 0x29, 0x23, - 0x23, 0x23, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x23, 0x22, 0x22, 0x23, 0x23, 0x23, 0x22, 0x22, - 0x22, 0x22, 0x22, 0xF0, 0xFC, 0xFC, 0xB3, 0xC7, - 0xB5, 0x93, 0xB5, 0x93, 0x93, 0x91, 0x93, 0x93, - 0x91, 0xB5, 0xC7, 0xAD, 0xD6, 0xD2, 0x5E, 0x3F, - 0x3F, 0x57, 0x57, 0x58, 0x4A, 0x41, 0x64, 0xDC, - 0xF1, 0xDF, 0xDA, 0x61, 0x45, 0x2E, 0x43, 0x47, - 0xCB, 0x63, 0x62, 0x5F, 0x58, 0x51, 0x53, 0x54, - 0x4C, 0x52, 0x5C, 0xCD, 0xD3, 0xD2, 0x60, 0x5D, - 0x5D, 0xFB, 0xFC, 0xFC, 0xFC, 0xDB, 0x49, 0x24, - 0x21, 0x23, 0x23, 0x22, 0x26, 0x26, 0x2A, 0x24, - 0x22, 0x23, 0x22, 0x21, 0x24, 0x26, 0x26, 0x2A, - 0x29, 0x2B, 0x24, 0x25, 0xFC, 0xFC, 0xB3, 0xC5, - 0x91, 0x91, 0x92, 0x91, 0x92, 0x92, 0x93, 0x93, - 0x91, 0x93, 0xC6, 0xAD, 0xDC, 0xD9, 0xD4, 0x60, - 0x43, 0x45, 0x58, 0x58, 0x57, 0x4B, 0x43, 0xCC, - 0xDD, 0xF1, 0xD8, 0xD5, 0x5D, 0x43, 0x41, 0x47, - 0xCD, 0x63, 0x62, 0x5D, 0x54, 0x4C, 0x55, 0x4B, - 0x51, 0x58, 0x62, 0xD0, 0xD0, 0x62, 0x5D, 0x5D, - 0x67, 0xFC, 0xFC, 0xFC, 0xFC, 0x58, 0x4E, 0x28, - 0x2A, 0x20, 0x23, 0x22, 0x23, 0x2A, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x23, 0x25, 0x2A, 0x2E, 0x2D, - 0x2E, 0x2E, 0x2E, 0x23, 0xFA, 0xFC, 0xB2, 0xBD, - 0xB5, 0x90, 0x91, 0x93, 0x92, 0x90, 0x91, 0x93, - 0x92, 0x91, 0xBD, 0xAD, 0xDE, 0xE0, 0xD8, 0xD7, - 0x61, 0x40, 0x48, 0x58, 0x58, 0x58, 0x48, 0x44, - 0xCF, 0xDE, 0xE0, 0xDD, 0xD0, 0x52, 0x41, 0x45, - 0xCD, 0x63, 0x61, 0x58, 0x4D, 0x51, 0x4C, 0x4B, - 0x54, 0x5D, 0xCC, 0xCE, 0x63, 0x61, 0x5D, 0x5D, - 0xFB, 0xFC, 0xFC, 0xFC, 0xFC, 0x4B, 0x27, 0x21, - 0x22, 0x22, 0x23, 0x22, 0x22, 0x24, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x20, - 0x27, 0x2B, 0x41, 0x2B, 0x23, 0xFC, 0xB2, 0xB6, - 0x93, 0x90, 0x92, 0xB5, 0x92, 0x90, 0xB5, 0x90, - 0x92, 0x93, 0xBC, 0xAD, 0xDC, 0xF1, 0xF3, 0xF0, - 0xD9, 0x61, 0x41, 0x4A, 0x58, 0x57, 0x57, 0x44, - 0x49, 0xD2, 0xDD, 0xD8, 0xDA, 0x63, 0x4A, 0x45, - 0xCC, 0x63, 0x5E, 0x52, 0x4B, 0x4C, 0x49, 0x51, - 0x5C, 0x61, 0xCD, 0x65, 0x63, 0x5E, 0x4E, 0xCF, - 0xFB, 0xFB, 0xF0, 0xFC, 0xD2, 0x2A, 0x22, 0x23, - 0x22, 0x22, 0x23, 0x22, 0x22, 0x21, 0x22, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x23, 0x22, 0x26, 0x41, 0x27, 0xF9, 0x81, 0xB7, - 0xB5, 0x91, 0x92, 0xB5, 0x91, 0xB5, 0x93, 0xB5, - 0x93, 0xB6, 0xB7, 0xB9, 0xCB, 0xD8, 0xF3, 0xF2, - 0xF2, 0xDB, 0x61, 0x2D, 0x51, 0x58, 0x57, 0x58, - 0x41, 0x51, 0xD4, 0xDB, 0xDC, 0xD1, 0x5B, 0x4C, - 0xCB, 0x62, 0x59, 0x4C, 0x4A, 0x49, 0x4B, 0x55, - 0x60, 0x64, 0xCC, 0x64, 0x5E, 0x55, 0x60, 0xE1, - 0xFB, 0xF8, 0xFC, 0xFC, 0x21, 0x22, 0x22, 0x23, - 0x22, 0x22, 0x23, 0x22, 0x22, 0x21, 0x22, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x23, 0x22, 0x21, 0x24, 0x2D, 0x21, 0xB4, 0xBB, - 0xB6, 0xB5, 0xB6, 0xB7, 0xB7, 0xB7, 0xB7, 0xB6, - 0xB6, 0xB6, 0xBB, 0xB9, 0x45, 0xCB, 0xDF, 0xF3, - 0xF3, 0xF3, 0xDB, 0x5E, 0x2C, 0x51, 0x58, 0x58, - 0x52, 0x2D, 0x5C, 0xD4, 0xD9, 0xD5, 0x63, 0x58, - 0x64, 0x60, 0x53, 0x49, 0x4A, 0x49, 0x52, 0x5C, - 0x63, 0xCD, 0xCD, 0x63, 0x5C, 0x4E, 0x65, 0xFC, - 0xFC, 0xF5, 0xFC, 0xD2, 0x23, 0x22, 0x22, 0x23, - 0x22, 0x22, 0x23, 0x22, 0x22, 0x21, 0x22, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x23, 0x22, 0x21, 0x22, 0x25, 0x29, 0xB3, 0xC7, - 0xB5, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, - 0xB6, 0xB5, 0xC7, 0xAD, 0x57, 0x3F, 0xCB, 0xF0, - 0xF3, 0xF3, 0xF2, 0xD9, 0x58, 0x41, 0x4C, 0x58, - 0x57, 0x47, 0x42, 0x62, 0xD4, 0xD4, 0xCC, 0x60, - 0x63, 0x5D, 0x50, 0x47, 0x48, 0x4B, 0x58, 0x60, - 0xCC, 0xCE, 0xCD, 0x60, 0x53, 0x5C, 0x62, 0xFB, - 0xF9, 0xFC, 0xFC, 0x21, 0x23, 0x22, 0x22, 0x23, - 0x22, 0x22, 0x23, 0x23, 0x23, 0x21, 0x22, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, 0x81, 0xC7, - 0xB7, 0xB7, 0xBC, 0xB7, 0xBC, 0xBC, 0xBC, 0xB7, - 0xB7, 0xB7, 0xC8, 0x80, 0x58, 0x57, 0x40, 0xCE, - 0xF3, 0xF2, 0xF2, 0xF0, 0xD5, 0x4C, 0x3F, 0x4B, - 0x52, 0x50, 0x2D, 0x4B, 0x64, 0xD2, 0xCC, 0x61, - 0x60, 0x58, 0x4A, 0x47, 0x47, 0x4C, 0x59, 0x64, - 0xD0, 0xD0, 0x64, 0x59, 0x49, 0x5D, 0xFB, 0xFC, - 0xD9, 0xFC, 0xD6, 0x23, 0x22, 0x22, 0x22, 0x23, - 0x22, 0x22, 0x23, 0x23, 0x21, 0x21, 0x22, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, 0xB4, 0xC8, - 0xBD, 0xB7, 0xBD, 0xBC, 0xBD, 0xC5, 0xBC, 0xC5, - 0xBC, 0xBD, 0xC7, 0xAC, 0x58, 0x57, 0x58, 0x2C, - 0xD1, 0xF0, 0xF3, 0xF3, 0xE0, 0xCD, 0x45, 0x3E, - 0x48, 0x4B, 0x3F, 0x41, 0x56, 0x64, 0x65, 0x62, - 0x5D, 0x52, 0x47, 0x48, 0x48, 0x53, 0x60, 0xCC, - 0xD2, 0xD0, 0x63, 0x52, 0x4E, 0x53, 0xFB, 0xFB, - 0xFC, 0xFC, 0x23, 0x23, 0x22, 0x23, 0x22, 0x23, - 0x22, 0x22, 0x23, 0x23, 0x20, 0x21, 0x22, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x23, 0x22, 0x23, 0x22, 0x23, 0x22, 0xB4, 0xC7, - 0xC5, 0xBC, 0xC5, 0xBD, 0xC5, 0xC5, 0xBD, 0xC5, - 0xBC, 0xC6, 0xC7, 0xB9, 0x58, 0x57, 0x58, 0x57, - 0x2D, 0xD4, 0xF1, 0xF2, 0xF0, 0xD9, 0x5D, 0x47, - 0x48, 0x3F, 0x42, 0x2C, 0x48, 0x5C, 0x5F, 0x60, - 0x58, 0x50, 0x47, 0x4A, 0x49, 0x55, 0x63, 0xD0, - 0xD2, 0xCD, 0x5D, 0x49, 0x4E, 0xE1, 0xFC, 0xF0, - 0xFC, 0xF8, 0x22, 0x22, 0x22, 0x23, 0x22, 0x23, - 0x22, 0x22, 0x23, 0x20, 0x21, 0x21, 0x22, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x23, 0x22, - 0x23, 0x22, 0x23, 0x23, 0x23, 0x22, 0xC4, 0xC8, - 0xBD, 0xBD, 0xC6, 0xBD, 0xC6, 0xC6, 0xC5, 0xC6, - 0xBD, 0xC6, 0xC7, 0xE4, 0x54, 0x57, 0x58, 0x57, - 0x57, 0x43, 0xD7, 0xE0, 0xF1, 0xD8, 0xCD, 0x4B, - 0x4A, 0x47, 0x42, 0x2C, 0x3F, 0x4D, 0x58, 0x5C, - 0x52, 0x4B, 0x48, 0x4B, 0x4A, 0x58, 0xCB, 0xD3, - 0xD2, 0xCD, 0x58, 0x47, 0x4A, 0xFC, 0xFC, 0xFB, - 0xFC, 0x2B, 0x22, 0x22, 0x22, 0x23, 0x22, 0x23, - 0x22, 0x22, 0x23, 0x26, 0x21, 0x21, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, - 0x22, 0x23, 0x22, 0x23, 0x22, 0x23, 0xE5, 0xC8, - 0xBA, 0xC5, 0xC6, 0xC6, 0xC6, 0xC7, 0xC6, 0xC7, - 0xC5, 0xC6, 0xC8, 0xE5, 0x2E, 0x54, 0x58, 0x57, - 0x57, 0x4C, 0x4D, 0xDA, 0xD8, 0xD8, 0xD4, 0x5C, - 0x4B, 0x4B, 0x3F, 0x42, 0x44, 0x4A, 0x51, 0x58, - 0x4B, 0x48, 0x4B, 0x51, 0x4D, 0x5F, 0xD0, 0xD1, - 0xD0, 0x64, 0x51, 0x44, 0x6B, 0xFC, 0xFB, 0xFC, - 0xFC, 0x21, 0x23, 0x22, 0x22, 0x23, 0x22, 0x23, - 0x22, 0x22, 0x23, 0x26, 0x21, 0x23, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, - 0x22, 0x23, 0x22, 0x23, 0x23, 0x23, 0xE5, 0xED, - 0xE7, 0xBA, 0xC8, 0xC6, 0xC6, 0xC6, 0xC6, 0xC7, - 0xC7, 0xE5, 0xED, 0xE6, 0x61, 0x41, 0x52, 0x58, - 0x58, 0x57, 0x45, 0x5E, 0xD7, 0xDD, 0xD5, 0x60, - 0x4B, 0x4C, 0x48, 0x4D, 0x4D, 0x50, 0x4D, 0x56, - 0x4A, 0x3E, 0x53, 0x53, 0x52, 0x63, 0xD3, 0xD0, - 0xCE, 0x60, 0x4A, 0x45, 0xFC, 0xFC, 0xF7, 0xFC, - 0xFC, 0x21, 0x23, 0x23, 0x22, 0x23, 0x22, 0x23, - 0x22, 0x23, 0x21, 0x2A, 0x20, 0x23, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x23, 0x22, 0x23, 0x22, 0x21, 0x23, 0xEB, 0xF6, - 0xF6, 0xED, 0xED, 0xED, 0xED, 0xED, 0xED, 0xED, - 0xF6, 0xF6, 0xF6, 0xE6, 0xDB, 0x58, 0x45, 0x4B, - 0x58, 0x57, 0x4D, 0x4B, 0x64, 0xD4, 0xD0, 0x5C, - 0x48, 0x51, 0x4C, 0x5D, 0x5E, 0x5C, 0x56, 0x59, - 0x3E, 0x4A, 0x58, 0x54, 0x52, 0x65, 0xD3, 0xD0, - 0xCF, 0x5D, 0x48, 0xFC, 0xFC, 0xFC, 0xFA, 0xFC, - 0xFC, 0x21, 0x22, 0x23, 0x22, 0x23, 0x22, 0x23, - 0x22, 0x23, 0x21, 0x2A, 0x21, 0x23, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x23, 0x22, 0x23, 0x22, 0x21, 0x4F, 0xE6, 0xC6, - 0xC6, 0xBD, 0xC6, 0xBD, 0xBD, 0xBD, 0xBD, 0xC6, - 0xC5, 0xBA, 0xC7, 0xE6, 0xF2, 0xD4, 0x49, 0x4B, - 0x3E, 0x4D, 0x52, 0x3E, 0x52, 0x63, 0x64, 0x56, - 0x48, 0x54, 0x4D, 0x61, 0xCC, 0xCC, 0x60, 0x60, - 0x47, 0x4D, 0x5C, 0x53, 0x58, 0xCF, 0xD1, 0xCF, - 0xD0, 0x59, 0x45, 0xFC, 0xFC, 0xFC, 0xEF, 0xF9, - 0xFC, 0x21, 0x23, 0x22, 0x23, 0x22, 0x23, 0x22, - 0x23, 0x22, 0x23, 0x2A, 0x21, 0x23, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x23, 0x22, 0x23, 0x22, 0x23, 0x4F, 0xE4, 0xB9, - 0xAF, 0x80, 0x80, 0x8E, 0x8E, 0x8E, 0x8E, 0x8F, - 0x80, 0xB4, 0xB9, 0xE4, 0x7F, 0xDE, 0x61, 0x52, - 0x54, 0x48, 0x3F, 0x43, 0x4D, 0x56, 0x59, 0x4B, - 0x3E, 0x58, 0x53, 0x61, 0xD3, 0xD4, 0xCF, 0xCD, - 0x4C, 0x58, 0x5F, 0x53, 0x5E, 0xD3, 0xD0, 0xCE, - 0xCE, 0x52, 0x3F, 0xFC, 0xFC, 0xFC, 0xF7, 0x65, - 0xFA, 0x22, 0x23, 0x22, 0x23, 0x22, 0x23, 0x22, - 0x23, 0x22, 0x21, 0x2A, 0x23, 0x23, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x23, 0x22, 0x23, 0x22, 0x21, 0xB1, 0xE4, 0xE6, - 0x7C, 0xB1, 0x7C, 0xB1, 0xB2, 0xB2, 0xB3, 0x3D, - 0xB3, 0x3C, 0xE5, 0xB3, 0xB0, 0xF1, 0xD0, 0x58, - 0x5D, 0x4D, 0x40, 0x41, 0x48, 0x51, 0x4C, 0x3F, - 0x3F, 0x4D, 0x5A, 0x5A, 0xD5, 0xD9, 0xD7, 0xD4, - 0x57, 0x5E, 0x61, 0x4C, 0x63, 0xD4, 0xCF, 0xCE, - 0xCB, 0x4D, 0x4A, 0xFC, 0xFC, 0xFC, 0xFC, 0xF0, - 0xFB, 0x22, 0x23, 0x22, 0x23, 0x22, 0x23, 0x22, - 0x23, 0x22, 0x23, 0x2A, 0x21, 0x23, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x22, 0x23, 0x22, 0x23, 0x23, 0xB1, 0x81, 0x7D, - 0x39, 0x35, 0x35, 0x36, 0x36, 0x36, 0x36, 0x36, - 0x36, 0x36, 0x7C, 0xB2, 0xB0, 0xDF, 0xD2, 0x57, - 0x60, 0x59, 0x5B, 0x59, 0x52, 0x4C, 0x4A, 0x40, - 0x42, 0x4A, 0x53, 0x4D, 0xD2, 0xDE, 0xDE, 0xD9, - 0x5E, 0x5E, 0x60, 0x4A, 0xCD, 0xD1, 0xCF, 0xCE, - 0x63, 0x49, 0x5C, 0xFB, 0xE8, 0x89, 0x9F, 0xFC, - 0xD6, 0x21, 0x21, 0x23, 0x22, 0x22, 0x23, 0x22, - 0x23, 0x22, 0x21, 0x2A, 0x22, 0x23, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x7F, 0xB9, - 0x71, 0x6C, 0x38, 0x38, 0x33, 0x33, 0x33, 0x38, - 0x38, 0x71, 0xAD, 0xE4, 0xD3, 0xDA, 0xCC, 0x52, - 0x63, 0x60, 0xCE, 0xD4, 0xCF, 0x60, 0x4C, 0x40, - 0x3F, 0x45, 0x4B, 0x5A, 0xCB, 0xD8, 0xDE, 0xDC, - 0x5E, 0x5E, 0x5F, 0x4C, 0xD2, 0xD2, 0xCF, 0xCF, - 0x61, 0x45, 0x5E, 0xA7, 0x9D, 0x95, 0x8B, 0x99, - 0xFC, 0x41, 0x21, 0x23, 0x23, 0x22, 0x23, 0x22, - 0x23, 0x22, 0x23, 0x2A, 0x23, 0x23, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x77, 0x77, 0xF6, - 0xFC, 0x7D, 0x7D, 0x7E, 0x7E, 0x7E, 0x7E, 0x7D, - 0x7D, 0xFC, 0x47, 0x64, 0xD0, 0xD0, 0x5D, 0x4B, - 0x62, 0xCC, 0xD1, 0xDE, 0xDE, 0xD4, 0x5E, 0x43, - 0x3F, 0x3E, 0x48, 0x53, 0x58, 0xDB, 0xD8, 0xDC, - 0x5E, 0x5E, 0x5E, 0x53, 0xD4, 0xD2, 0xD0, 0xD0, - 0x5E, 0x49, 0xA7, 0xA6, 0x89, 0x95, 0x8B, 0x9C, - 0x9C, 0xFB, 0xD4, 0x22, 0x22, 0x22, 0x22, 0x23, - 0x22, 0x23, 0x23, 0x2A, 0x22, 0x23, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, - 0x23, 0x22, 0x23, 0x23, 0x98, 0x8C, 0x8C, 0x88, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xF8, - 0xE9, 0x9C, 0x48, 0x5C, 0xD0, 0xCB, 0x48, 0x49, - 0x5B, 0xCB, 0xCD, 0xE0, 0xF1, 0xDD, 0xD0, 0x4A, - 0x41, 0x47, 0x45, 0x4C, 0x48, 0xD7, 0xDE, 0xDC, - 0x5E, 0x5E, 0x5A, 0x58, 0xD1, 0xD0, 0xD0, 0xD2, - 0x5C, 0x55, 0xA7, 0xA6, 0x87, 0x86, 0x89, 0x94, - 0x9C, 0xA9, 0xFC, 0xF4, 0x22, 0x23, 0x22, 0x23, - 0x22, 0x23, 0x22, 0x2A, 0x21, 0x23, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, - 0x22, 0x23, 0x22, 0x23, 0xA4, 0x89, 0x8C, 0xAA, - 0xFB, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xF7, - 0x85, 0x88, 0x8D, 0x59, 0x64, 0x63, 0x47, 0x3E, - 0x4C, 0x60, 0x61, 0xE0, 0xF0, 0xDF, 0xD9, 0x5D, - 0x2E, 0x3E, 0x3E, 0x47, 0x4D, 0xCD, 0xDE, 0xDC, - 0x5D, 0x5C, 0x51, 0x5D, 0xD1, 0xD2, 0xD2, 0xD4, - 0x5A, 0xBE, 0xA7, 0x98, 0x8A, 0x8A, 0xA0, 0x8B, - 0x86, 0x86, 0xF7, 0xFC, 0xF7, 0x26, 0x23, 0x23, - 0x22, 0x22, 0x22, 0x22, 0x21, 0x22, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, - 0x22, 0x21, 0x21, 0x21, 0xA1, 0x98, 0x9F, 0xBF, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xA7, - 0x8C, 0x86, 0x8D, 0x59, 0x5E, 0x5D, 0x3F, 0x3E, - 0x47, 0x53, 0x63, 0xD9, 0xF0, 0xF1, 0xDE, 0xD0, - 0x43, 0x3E, 0x47, 0x45, 0x4A, 0x5B, 0xDC, 0xDA, - 0x5D, 0x59, 0x49, 0x5F, 0xD1, 0xD2, 0xD3, 0xB9, - 0xA5, 0xA7, 0x98, 0x9B, 0x96, 0x9D, 0x89, 0x89, - 0x8B, 0x9C, 0x9D, 0xFC, 0xFC, 0xFC, 0x26, 0x22, - 0x23, 0x23, 0x22, 0x22, 0x21, 0x22, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, - 0x22, 0x22, 0x29, 0x2D, 0x99, 0x99, 0xA2, 0xAA, - 0xC4, 0xFB, 0xFC, 0xFC, 0xFC, 0xF6, 0xBF, 0xA2, - 0x9C, 0x9C, 0x8E, 0xDC, 0xCD, 0x51, 0x41, 0x3E, - 0x45, 0x49, 0x58, 0xCD, 0xE0, 0xE0, 0xD8, 0xDA, - 0x4C, 0x4A, 0x45, 0x45, 0x48, 0x47, 0xDA, 0xDA, - 0x5C, 0x58, 0x44, 0x69, 0xA9, 0x98, 0xA4, 0xA6, - 0xA1, 0xA4, 0x99, 0x9E, 0x9D, 0x8B, 0x8A, 0x97, - 0x87, 0x9A, 0x8A, 0xC2, 0xFC, 0xFC, 0xFC, 0x4D, - 0x21, 0x21, 0x23, 0x22, 0x21, 0x22, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x23, 0x22, - 0x21, 0x22, 0x2D, 0x34, 0xA4, 0xA2, 0xA2, 0xA9, - 0xBF, 0xC0, 0xC3, 0xC1, 0xC0, 0xBE, 0xA6, 0x9D, - 0x99, 0x87, 0xA2, 0xF1, 0xDC, 0x64, 0x42, 0x45, - 0x47, 0x3E, 0x49, 0x4C, 0xDD, 0xDF, 0xD8, 0xDB, - 0x5E, 0x4C, 0x48, 0x45, 0x45, 0x41, 0xD1, 0xD6, - 0x5A, 0x55, 0x3F, 0xA7, 0xA1, 0x98, 0x9F, 0x99, - 0x9F, 0x9D, 0x9A, 0x95, 0x8B, 0x97, 0x89, 0x8A, - 0x88, 0x94, 0x9C, 0x8C, 0xFC, 0xFC, 0xFC, 0xFC, - 0xF4, 0x21, 0x23, 0x22, 0x21, 0x22, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, - 0x23, 0x23, 0x2C, 0x2C, 0xA8, 0xA2, 0xA4, 0xA4, - 0xA9, 0xAA, 0xAA, 0xAA, 0xA9, 0xA6, 0x98, 0x9C, - 0x8B, 0x88, 0x98, 0x8D, 0xD8, 0xD6, 0x4E, 0x47, - 0x47, 0x49, 0x47, 0x3F, 0xDA, 0xDD, 0xDE, 0xDD, - 0xCC, 0x4A, 0x4B, 0x3E, 0x45, 0x43, 0x61, 0xD4, - 0x56, 0x51, 0x44, 0xA4, 0x9B, 0x8B, 0x9C, 0x9A, - 0xA0, 0xA2, 0x98, 0x98, 0x8B, 0x8B, 0x98, 0x98, - 0x84, 0x8B, 0x94, 0x8A, 0xA4, 0xFC, 0xFC, 0xFC, - 0xFC, 0xF2, 0x21, 0x22, 0x21, 0x22, 0x23, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x23, 0x23, - 0x23, 0x22, 0x2C, 0x2D, 0xC0, 0xA4, 0xA2, 0xA4, - 0xA4, 0xA6, 0xA6, 0xA6, 0xA4, 0xA2, 0x9F, 0x89, - 0x8B, 0x9C, 0x9C, 0x8B, 0x68, 0xDB, 0x5F, 0x4B, - 0x3E, 0x49, 0x4B, 0x3E, 0xCC, 0xDA, 0xDC, 0xDD, - 0xD3, 0x49, 0x52, 0x48, 0x45, 0x45, 0x53, 0xD0, - 0x51, 0x4A, 0x44, 0xA4, 0x9B, 0x8B, 0x9C, 0xA0, - 0x9B, 0x86, 0x89, 0x98, 0x89, 0x8A, 0x96, 0x8A, - 0x9C, 0x89, 0x89, 0x9C, 0x8C, 0xF6, 0xFC, 0xFC, - 0xFC, 0xFC, 0x21, 0x22, 0x21, 0x22, 0x23, 0x22, - 0x22, 0x22, 0x22, 0x23, 0x22, 0x21, 0x22, 0x23, - 0x22, 0x21, 0x2B, 0x34, 0xC0, 0xA8, 0xA4, 0xA2, - 0xA2, 0x98, 0xA1, 0xA0, 0x98, 0x9F, 0x95, 0x8A, - 0x94, 0xA1, 0x8A, 0x84, 0x9B, 0x68, 0xCC, 0x49, - 0x4A, 0x47, 0x4C, 0x4B, 0x51, 0xD3, 0xDA, 0xDC, - 0xD5, 0x56, 0x56, 0x4A, 0x3E, 0x45, 0x48, 0x63, - 0x4A, 0x47, 0x3E, 0xA7, 0x98, 0x9D, 0x9E, 0x8B, - 0x95, 0x9B, 0x89, 0x86, 0x9B, 0x8B, 0x89, 0x84, - 0x9A, 0xA1, 0x95, 0x9A, 0x8C, 0xA4, 0xFC, 0xFC, - 0xFC, 0xFA, 0x23, 0x22, 0x21, 0x22, 0x23, 0x22, - 0x22, 0x22, 0x22, 0x23, 0x22, 0x21, 0x22, 0x23, - 0x21, 0x23, 0x2C, 0xF6, 0xBF, 0xA9, 0xA2, 0x99, - 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9B, 0x87, 0x8B, - 0x9C, 0x86, 0x9C, 0x8A, 0x87, 0x87, 0x89, 0x51, - 0x54, 0x47, 0x4B, 0x50, 0x4B, 0xCF, 0xD6, 0xDC, - 0xD5, 0x60, 0x54, 0x52, 0x48, 0x45, 0x40, 0x5A, - 0x45, 0x43, 0x47, 0xA7, 0x98, 0x9B, 0x95, 0x95, - 0x9A, 0x87, 0x98, 0x98, 0x8A, 0x86, 0x87, 0x9E, - 0x9B, 0x95, 0x9D, 0x9D, 0x99, 0x85, 0xA6, 0xFA, - 0xF2, 0x21, 0x23, 0x22, 0x21, 0x22, 0x23, 0x22, - 0x22, 0x22, 0x22, 0x23, 0x22, 0x21, 0x22, 0x22, - 0x21, 0x24, 0xFB, 0xF7, 0xBF, 0xA6, 0xA2, 0x99, - 0x97, 0x89, 0x86, 0x89, 0x9C, 0x96, 0x9E, 0x94, - 0x89, 0x99, 0x98, 0x89, 0x9E, 0x9B, 0x89, 0x8B, - 0x58, 0x4B, 0x4A, 0x52, 0x48, 0xCC, 0xD3, 0xDA, - 0xD3, 0x65, 0x4C, 0x58, 0x49, 0x3E, 0x2E, 0x4D, - 0x40, 0x41, 0x45, 0xA9, 0xA1, 0x9B, 0x9E, 0x9C, - 0x95, 0x8A, 0x94, 0x89, 0x96, 0x87, 0x9C, 0x9A, - 0x84, 0x9D, 0x9C, 0x9E, 0x9A, 0x9C, 0x9D, 0xBB, - 0x23, 0x23, 0x22, 0x22, 0x21, 0x22, 0x23, 0x22, - 0x22, 0x22, 0x22, 0x23, 0x22, 0x21, 0x23, 0x23, - 0x24, 0xFC, 0xFC, 0xF6, 0xBF, 0xA6, 0x9F, 0x99, - 0x89, 0x95, 0x87, 0x94, 0x9D, 0x9E, 0x97, 0x9E, - 0x95, 0x9B, 0x89, 0x95, 0x95, 0x9B, 0x89, 0x87, - 0x5D, 0x56, 0x3E, 0x51, 0x3E, 0x60, 0xCF, 0xD3, - 0xD2, 0xCD, 0x5C, 0x49, 0x4B, 0x3E, 0x2C, 0x48, - 0x3E, 0x43, 0x3E, 0xA9, 0xA1, 0x9B, 0x97, 0x94, - 0x95, 0x9A, 0x9C, 0x87, 0x87, 0x9B, 0x9C, 0x95, - 0x9D, 0x89, 0x9A, 0x89, 0x9E, 0x9E, 0x8C, 0xA6, - 0x20, 0x23, 0x23, 0x22, 0x23, 0x22, 0x23, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x21, 0x21, 0x20, 0x40, - 0xFC, 0xFC, 0xFC, 0xEC, 0xBE, 0xA4, 0x9F, 0x99, - 0x95, 0x9F, 0xA0, 0x88, 0x9D, 0x8B, 0x97, 0x95, - 0x87, 0x95, 0x96, 0x95, 0x97, 0x94, 0x94, 0x98, - 0xD3, 0x4C, 0x47, 0x4D, 0x42, 0x4C, 0x60, 0xCC, - 0xCE, 0xD0, 0x65, 0x4B, 0x47, 0x44, 0x2B, 0x45, - 0x4B, 0x47, 0x49, 0xA7, 0xA1, 0x9A, 0x97, 0x89, - 0x95, 0x97, 0x97, 0x9E, 0x89, 0x95, 0x89, 0x9C, - 0x87, 0x95, 0x97, 0x99, 0x95, 0x99, 0x9F, 0xA4, - 0xC4, 0x21, 0x21, 0x23, 0x21, 0x23, 0x23, 0x23, - 0x23, 0x23, 0x23, 0x23, 0x21, 0x20, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xEA, 0xAA, 0xA6, 0xA2, 0x99, - 0x8B, 0x9A, 0x95, 0x9E, 0x9E, 0x9A, 0x94, 0x87, - 0x94, 0x94, 0x89, 0x94, 0x9B, 0x9B, 0xA7, 0xDC, - 0xDB, 0x65, 0x2E, 0x3E, 0x43, 0x44, 0x49, 0x58, - 0x63, 0xD3, 0xD3, 0x5E, 0x42, 0x42, 0x2D, 0x40, - 0x54, 0x4C, 0x4A, 0xA7, 0xA0, 0x99, 0x9B, 0x94, - 0xA0, 0x8A, 0x9B, 0x9D, 0x87, 0x95, 0x94, 0x8B, - 0x8A, 0x98, 0x9C, 0x8A, 0x9B, 0x99, 0xA2, 0xA6, - 0xBF, 0xEC, 0x2A, 0x20, 0x21, 0x23, 0x21, 0x20, - 0x20, 0x20, 0x20, 0x4C, 0xF9, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xEB, 0xAA, 0xA4, 0x9F, 0x9C, - 0x8B, 0x9B, 0x88, 0x84, 0x9E, 0x9D, 0x96, 0x94, - 0x94, 0x9A, 0x9B, 0x9B, 0xA4, 0xD5, 0xCD, 0xDE, - 0xF1, 0xDA, 0x4C, 0x2D, 0x41, 0x2B, 0x42, 0x4C, - 0x5E, 0xD4, 0xD7, 0xCD, 0x49, 0x2E, 0x2E, 0x41, - 0x5E, 0x57, 0xA7, 0xA6, 0xA7, 0xA4, 0xA2, 0x98, - 0x9D, 0x9C, 0xA1, 0x99, 0x9D, 0x88, 0x8B, 0x9C, - 0x8A, 0x9C, 0x9C, 0x94, 0x9C, 0x89, 0xA0, 0xA6, - 0xAA, 0xEB, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFB, 0xE9, 0xAA, 0xA6, 0xA2, 0x8B, - 0x8B, 0x8A, 0x86, 0x9B, 0x9C, 0x98, 0xA0, 0x9B, - 0x9B, 0x84, 0xA7, 0xB4, 0x61, 0xD1, 0xD2, 0xE0, - 0xF1, 0xDC, 0x61, 0x2D, 0x2E, 0x3F, 0x56, 0x62, - 0x5D, 0xD4, 0xD9, 0xD3, 0x54, 0x41, 0x41, 0x44, - 0xCB, 0x60, 0x52, 0xA9, 0xA9, 0xA9, 0xA7, 0xA6, - 0xA6, 0xA4, 0xA4, 0xA2, 0xA2, 0x9D, 0x95, 0x89, - 0x9C, 0x8A, 0x9E, 0x9C, 0x8A, 0x9E, 0xA0, 0xA8, - 0xC0, 0xE9, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xE9, 0xAA, 0xA6, 0xA0, 0x99, - 0x9C, 0x8B, 0x9A, 0x84, 0x9B, 0x9B, 0x98, 0x98, - 0xA9, 0xB9, 0x49, 0x57, 0xCB, 0xD4, 0xD3, 0xF1, - 0xD8, 0xDA, 0xCE, 0x3F, 0x41, 0x4B, 0x5D, 0xCB, - 0x5E, 0xD6, 0xDB, 0xD6, 0x5D, 0x43, 0x3F, 0x49, - 0xD1, 0xCC, 0x4F, 0xDD, 0xC3, 0xBB, 0xBF, 0xAA, - 0xAA, 0xA9, 0xAA, 0xA8, 0xA8, 0xA6, 0xA6, 0xA2, - 0x9C, 0x9F, 0x9B, 0x9A, 0x9D, 0xA2, 0xA8, 0xAA, - 0xC1, 0xEA, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xEA, 0xC0, 0xAA, 0xA6, 0xA2, - 0xA2, 0x99, 0xA0, 0xA0, 0xA4, 0xA7, 0xA9, 0xC0, - 0x67, 0x49, 0x54, 0x60, 0xD0, 0xD4, 0xCC, 0xDF, - 0xD9, 0xD5, 0xD2, 0x3E, 0x47, 0x56, 0x60, 0xCD, - 0x5D, 0xD9, 0xD9, 0xD6, 0x61, 0x3F, 0x47, 0x52, - 0xD6, 0xD3, 0x62, 0x4D, 0x40, 0x4A, 0x57, 0xCA, - 0xC3, 0xC1, 0xC1, 0xC0, 0xBF, 0xBF, 0xAA, 0xAA, - 0xA6, 0xA4, 0xA4, 0xA4, 0xA6, 0xA8, 0xBE, 0xC1, - 0xC9, 0xEB, 0xFB, 0xFB, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, - 0xFC, 0xFC, 0xFC, 0xEB, 0xC3, 0xC0, 0xAA, 0xA8, - 0xA6, 0xA6, 0xA6, 0xA9, 0xAA, 0xC0, 0xE8, 0xD0, - 0xD2, 0x4C, 0x5E, 0x64, 0xD0, 0xD1, 0x5F, 0xD9, - 0xD5, 0xD1, 0xD0, 0x48, 0x52, 0x5C, 0x64, 0xCD, - 0x5C, 0xDC, 0xD7, 0xD5, 0x62, 0x3F, 0x4C, 0x53, - 0xDA, 0xD7, 0xCE, 0x56, 0x40, 0x4B, 0x52, 0x56, - 0xCE, 0xDF, 0x6A, 0xEB, 0xE9, 0xC9, 0xC3, 0xC0, - 0xC0, 0xBF, 0xBE, 0xAA, 0xBF, 0xC0, 0xC3, 0xC9, - 0xEA, 0xF6, 0xEE, 0x58, 0x57, 0x5E, 0xD6, 0xD0, - 0xD2, 0x61, 0xCB, 0xD6, 0xD6, 0xD4, 0xDF, 0xF3, - 0xF2, 0xDD, 0xD7, 0xEB, 0xC9, 0xC1, 0xC0, 0xBF, - 0xAA, 0xAA, 0xAA, 0xBE, 0xC3, 0xF0, 0xD2, 0xD2, - 0xD2, 0x51, 0x62, 0xCC, 0xD0, 0xCC, 0x61, 0xD3, - 0xCF, 0xCE, 0xD2, 0x48, 0x5A, 0x61, 0xCC, 0xCE, - 0x5F, 0xD9, 0xD5, 0xD1, 0x63, 0x44, 0x56, 0x56, - 0xDC, 0xD9, 0xD4, 0x5E, 0x42, 0x4A, 0x4C, 0x57, - 0x5D, 0xD8, 0xE0, 0xD8, 0xDC, 0xCB, 0x66, 0xEC, - 0xE8, 0xC3, 0xC3, 0xC3, 0xC3, 0xC9, 0xE8, 0xEA, - 0xF6, 0x50, 0x3E, 0x58, 0x57, 0x5A, 0xD6, 0xD4, - 0xCC, 0x4B, 0x53, 0x5C, 0x64, 0xD1, 0xDF, 0xF3, - 0xF1, 0xDE, 0xD9, 0xF6, 0xEB, 0xC9, 0xC1, 0xC1, - 0xC0, 0xC0, 0xC1, 0xC9, 0xF0, 0xD6, 0xCD, 0xD6, - 0xD3, 0x53, 0xCB, 0xCF, 0xCD, 0x5F, 0x5F, 0xCE, - 0xCF, 0xCD, 0xD0, 0x47, 0x5F, 0xCB, 0xCE, 0xCD, - 0x63, 0xD6, 0xD3, 0xD1, 0x63, 0x3F, 0x58, 0x58, - 0xDB, 0xDC, 0xDA, 0x65, 0x3E, 0x49, 0x49, 0x4D, - 0x49, 0xDC, 0xDF, 0xE0, 0xDE, 0xD5, 0x47, 0x47, - 0x46, 0x6B, 0xEB, 0xEA, 0xE9, 0xEA, 0xEB, 0xF6, - 0xD0, 0x57, 0x57, 0x47, 0x47, 0x5B, 0xD4, 0xD4, - 0xCD, 0x44, 0x3E, 0x4B, 0x50, 0x4B, 0x51, 0xD5, - 0xDB, 0xD8, 0xDE, 0x4B, 0xF6, 0xF6, 0xEA, 0xE9, - 0xE8, 0xEA, 0xEB, 0x67, 0x5E, 0xCC, 0xD6, 0xDC, - 0xD5, 0x58, 0xCE, 0xCE, 0x62, 0x50, 0xCC, 0xD3, - 0xD2, 0xCD, 0xCD, 0x4B, 0x64, 0xCE, 0xCE, 0x64, - 0xCC, 0xD3, 0xD2, 0xD2, 0x61, 0x47, 0x5D, 0x5C, - 0xDD, 0xDD, 0xD9, 0xD1, 0x4C, 0x47, 0x49, 0x4A, - 0x4B, 0xD1, 0xD8, 0xE0, 0xDF, 0xDD, 0x5D, 0x4A, - 0x48, 0x52, 0x51, 0x3F, 0xF6, 0xEC, 0xE0, 0xE0, - 0xD3, 0x5E, 0x5F, 0x50, 0x4B, 0x50, 0xCB, 0xCE, - 0x64, 0x45, 0x4C, 0x57, 0x57, 0x58, 0x52, 0xD6, - 0xD3, 0xDE, 0xDF, 0xD1, 0x3E, 0x4B, 0xF6, 0xF6, - 0xEC, 0x66, 0x53, 0x43, 0x56, 0xD1, 0xD9, 0xDE, - 0xD4, 0x5E, 0xCE, 0xCC, 0x5B, 0x2C, 0xD4, 0xD5, - 0xD2, 0xD0, 0x63, 0x5D, 0xCD, 0xD0, 0xCD, 0x5E, - 0xD0, 0xCF, 0xCE, 0xD2, 0x5E, 0x50, 0x60, 0x5D, - 0xDE, 0xDD, 0xDC, 0xD7, 0x5D, 0x45, 0x47, 0x3E, - 0x4B, 0x5E, 0xDE, 0xDF, 0xE0, 0xD8, 0xCF, 0x3E, - 0x45, 0x51, 0x58, 0x42, 0xCB, 0xDA, 0xDE, 0xD8, - 0xD2, 0x61, 0xCC, 0xCF, 0xD6, 0xDA, 0xDA, 0xD5, - 0xD0, 0x50, 0x44, 0x57, 0x57, 0x58, 0x45, 0xD1, - 0xD1, 0xD7, 0xDF, 0xDF, 0xD7, 0xCF, 0x64, 0x60, - 0xCE, 0xCE, 0xCE, 0x63, 0xCF, 0xDA, 0xDE, 0xD9, - 0xCF, 0x63, 0xCD, 0x63, 0x4D, 0x4B, 0xD6, 0xD5, - 0xCE, 0xD3, 0x60, 0xCB, 0xD0, 0xD0, 0x65, 0x47, - 0xD0, 0xCC, 0xCC, 0xD1, 0x59, 0x5D, 0x63, 0x5E, - 0xDD, 0xDD, 0xDE, 0xDC, 0xCB, 0x40, 0x48, 0x45, - 0x3E, 0x3E, 0xD9, 0xDF, 0xE0, 0xDF, 0xDA, 0x51, - 0x4C, 0x48, 0x56, 0x4C, 0x5B, 0xD2, 0xDA, 0xDB, - 0xCB, 0x5F, 0xD0, 0xCC, 0xDC, 0xF0, 0xF3, 0xE0, - 0xDD, 0xCC, 0x41, 0x50, 0x57, 0x57, 0x4B, 0x5D, - 0xD3, 0xD1, 0xDE, 0xDF, 0xDE, 0xD7, 0xD0, 0xD0, - 0xD5, 0xD6, 0xD6, 0xCE, 0xD7, 0xDC, 0xDA, 0xD5, - 0x60, 0x63, 0x64, 0x5E, 0x47, 0x61, 0xD5, 0xD2, - 0xCF, 0xD0, 0x59, 0xCD, 0xD1, 0xCF, 0x61, 0x4D, - 0xCC, 0xCE, 0xCD, 0xD0, 0x52, 0x61, 0x64, 0x60, - 0xDA, 0xDE, 0xDE, 0xDD, 0xD1, 0x4B, 0x4A, 0x45, - 0x3E, 0x41, 0xCD, 0xDE, 0xE0, 0xF1, 0xDE, 0x63, - 0x4A, 0x4A, 0x4A, 0x4B, 0x50, 0xCB, 0xD4, 0xD7, - 0x5E, 0x54, 0x62, 0xD3, 0xD4, 0xF0, 0xF3, 0xF3, - 0xF2, 0xDE, 0x61, 0x40, 0x49, 0x56, 0x4D, 0x3E, - 0x4B, 0xCE, 0xD9, 0xD8, 0xD9, 0xD5, 0xCF, 0xD2, - 0xD6, 0xD6, 0xD1, 0xD1, 0xD7, 0xD5, 0xCF, 0xD0, - 0x54, 0x64, 0x63, 0x56, 0x2C, 0xCB, 0xD1, 0xCC, - 0xD3, 0xCD, 0x54, 0xCF, 0xD1, 0xCE, 0x5E, 0x5C, - 0xCE, 0xCE, 0xCE, 0xCB, 0x4B, 0x63, 0xCC, 0x61, - 0xD4, 0xDC, 0xDE, 0xDE, 0xDA, 0x5D, 0x45, 0x45, - 0x48, 0x3F, 0x52, 0xD9, 0xD8, 0xDF, 0xDF, 0xD2, - 0x52, 0x4B, 0x3E, 0x2E, 0x47, 0x60, 0xCF, 0xD3, - 0x59, 0x48, 0x50, 0x5E, 0xCC, 0xDE, 0xF2, 0xF2, - 0xF3, 0xF3, 0xDD, 0x5D, 0x3E, 0x48, 0x47, 0x47, - 0x58, 0xD1, 0xDA, 0xDA, 0xD5, 0xD1, 0xCD, 0xD2, - 0xD3, 0xCF, 0xD3, 0xD1, 0xCD, 0xD3, 0xD2, 0x5E, - 0x52, 0x64, 0x60, 0x4B, 0x45, 0x61, 0xCD, 0xD3, - 0xD3, 0x64, 0x61, 0xD0, 0xD0, 0x64, 0x45, 0x63, - 0xD0, 0xCE, 0xD0, 0x60, 0x56, 0xCB, 0xCC, 0x62, - 0xCE, 0xDA, 0xDE, 0xD8, 0xDD, 0xCC, 0x45, 0x49, - 0x3E, 0x47, 0x42, 0xD1, 0xDC, 0xD8, 0xD8, 0xD3, - 0x5D, 0x4C, 0x49, 0x3F, 0x47, 0x59, 0xCD, 0xCF, - 0x59, 0x2E, 0x48, 0x47, 0x52, 0x63, 0xF0, 0xF2, - 0xF3, 0xF3, 0xF2, 0xDA, 0x52, 0x4B, 0x52, 0x58, - 0x5E, 0x63, 0xD0, 0xD0, 0xD0, 0xCF, 0xCE, 0xCE, - 0xCF, 0x65, 0x61, 0xD6, 0xD6, 0xD6, 0xCB, 0x4B, - 0x61, 0x62, 0x5D, 0x43, 0x4B, 0x61, 0xD0, 0xD4, - 0xD1, 0x61, 0xCE, 0xD2, 0xCD, 0x5E, 0x4A, 0xCE, - 0xD0, 0xCC, 0xD0, 0x59, 0x61, 0xCC, 0xCC, 0x62, - 0xD1, 0xD5, 0xDE, 0xD8, 0xDD, 0xCF, 0x4B, 0x4A, - 0x45, 0x3E, 0x2D, 0xCB, 0xDC, 0xDE, 0xD8, 0xD5, - 0x60, 0x54, 0x51, 0x4C, 0x4D, 0x5C, 0xCC, 0xCE, - 0x5A, 0x2C, 0x50, 0x53, 0x3E, 0x59, 0xD8, 0xF3, - 0xF2, 0xF3, 0xF3, 0xE0, 0x5E, 0x4A, 0x4C, 0x53, - 0x5E, 0x63, 0xCC, 0xCC, 0xCC, 0xCD, 0xCF, 0xD3, - 0x62, 0x53, 0xD6, 0xD6, 0xD6, 0xD6, 0x5B, 0x48, - 0x64, 0x63, 0x59, 0x44, 0x57, 0x63, 0xD2, 0xD3, - 0xD0, 0x5E, 0xD0, 0xD1, 0xCB, 0x58, 0x4C, 0xCF, - 0xCF, 0xCE, 0xCE, 0x57, 0x63, 0xCC, 0xCD, 0x57, + 0xD8, 0xA3, 0x98, 0x98, 0xA3, 0xB2, 0x2F, 0x2F, + 0xA3, 0x66, 0x98, 0x98, 0x98, 0xA3, 0x2F, 0xA3, + 0x98, 0x55, 0xA0, 0xA3, 0xB2, 0x51, 0x51, 0x2F, + 0x98, 0x55, 0x8F, 0x2F, 0x89, 0x44, 0x89, 0x51, + 0xB2, 0x2F, 0x66, 0xA3, 0x2F, 0x2F, 0x66, 0x66, + 0xA3, 0xB2, 0xB2, 0xB2, 0x89, 0xD8, 0x44, 0x44, + 0xD8, 0x83, 0xD8, 0xA3, 0x98, 0x98, 0xA3, 0xB2, + 0x2F, 0x2F, 0xA3, 0x66, 0x98, 0x98, 0x98, 0xA3, + 0x2F, 0xA3, 0x98, 0x55, 0xA0, 0xA3, 0xB2, 0x51, + 0x51, 0x2F, 0x98, 0x55, 0x8F, 0x2F, 0x89, 0x44, + 0xA3, 0x55, 0x55, 0x98, 0x2F, 0x2F, 0x2F, 0xA3, + 0x66, 0x66, 0x98, 0x98, 0x66, 0x66, 0x66, 0x98, + 0x55, 0xA5, 0x8F, 0xA3, 0x51, 0x51, 0xB2, 0x2F, + 0x66, 0x66, 0xA3, 0x51, 0x89, 0x51, 0xB2, 0x2F, + 0x2F, 0xA3, 0x66, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, + 0xB2, 0xB2, 0x2F, 0x2F, 0xB2, 0x51, 0x51, 0x51, + 0x51, 0x51, 0xA3, 0x55, 0x55, 0x98, 0x2F, 0x2F, + 0x2F, 0xA3, 0x66, 0x66, 0x98, 0x98, 0x66, 0x66, + 0x66, 0x98, 0x55, 0xA5, 0x8F, 0xA3, 0x51, 0x51, + 0xB2, 0x2F, 0x66, 0x66, 0xA3, 0x51, 0x89, 0x51, + 0x98, 0xA5, 0x55, 0x8F, 0x2F, 0xB2, 0x2F, 0xA3, + 0x66, 0x66, 0x98, 0x8F, 0x66, 0x66, 0x66, 0x98, + 0xA0, 0x8F, 0xA3, 0xB2, 0x51, 0x51, 0xB2, 0x2F, + 0xA3, 0xA3, 0x2F, 0xB2, 0x51, 0xB2, 0x2F, 0x2F, + 0xA3, 0x66, 0x98, 0xA3, 0x51, 0xB2, 0x2F, 0xA3, + 0xB2, 0x51, 0x51, 0xB2, 0xB2, 0x51, 0xB2, 0xB2, + 0xB2, 0x2F, 0x98, 0xA5, 0x55, 0x8F, 0x2F, 0xB2, + 0x2F, 0xA3, 0x66, 0x66, 0x98, 0x8F, 0x66, 0x66, + 0x66, 0x98, 0xA0, 0x8F, 0xA3, 0xB2, 0x51, 0x51, + 0xB2, 0x2F, 0xA3, 0xA3, 0x2F, 0x51, 0x51, 0xB2, + 0xA0, 0xA5, 0x55, 0x66, 0xB2, 0x51, 0xB2, 0xA3, + 0x66, 0x66, 0x98, 0x66, 0x66, 0x66, 0x98, 0x98, + 0x66, 0xA3, 0x2F, 0xB2, 0x51, 0x51, 0xB2, 0xA3, + 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0xA3, + 0x66, 0x98, 0xB2, 0x4C, 0x54, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0xCE, 0x2F, 0xB2, 0x2F, 0x2F, + 0xA3, 0x98, 0xA0, 0xA5, 0x55, 0x66, 0xB2, 0x51, + 0xB2, 0xA3, 0x66, 0x66, 0x98, 0x66, 0x66, 0x66, + 0x98, 0x98, 0x66, 0xA3, 0x2F, 0xB2, 0x51, 0x51, + 0xB2, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, + 0xA0, 0xA0, 0x8F, 0xA3, 0xB2, 0x51, 0xB2, 0x2F, + 0x66, 0x66, 0x98, 0x66, 0x66, 0x66, 0x66, 0x66, + 0xA3, 0x2F, 0x51, 0x51, 0x51, 0xB2, 0x2F, 0xA3, + 0x66, 0x66, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, + 0x2F, 0xA0, 0xDA, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x9C, 0xB2, 0xA3, + 0x66, 0x98, 0xA0, 0xA0, 0x8F, 0xA3, 0xB2, 0x51, + 0xB2, 0x2F, 0x66, 0x66, 0x98, 0x66, 0x66, 0x66, + 0x66, 0x66, 0xA3, 0x2F, 0x51, 0x51, 0x51, 0xB2, + 0x2F, 0xA3, 0x66, 0x66, 0x66, 0xA3, 0xA3, 0xA3, + 0x8F, 0x8F, 0x66, 0x2F, 0x51, 0x51, 0xB2, 0xA3, + 0x66, 0x98, 0x98, 0x66, 0x66, 0x66, 0x2F, 0x2F, + 0xB2, 0x51, 0xB2, 0xB2, 0x2F, 0x2F, 0xA3, 0x66, + 0x66, 0x66, 0xA3, 0xA3, 0x2F, 0xA3, 0xA3, 0xB2, + 0x9C, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0xDA, 0x3A, 0x20, 0x54, 0x55, + 0xA3, 0x98, 0x8F, 0x8F, 0x66, 0x2F, 0x51, 0x51, + 0xB2, 0xA3, 0x66, 0x98, 0x98, 0x66, 0x66, 0x66, + 0x2F, 0x2F, 0xB2, 0x51, 0xB2, 0xB2, 0x2F, 0x2F, + 0xA3, 0x66, 0x66, 0x66, 0x2F, 0xA3, 0x2F, 0x2F, + 0x66, 0x66, 0xA3, 0x2F, 0xB2, 0xB2, 0x2F, 0x66, + 0x8F, 0x8F, 0x8F, 0x66, 0xA3, 0xA3, 0xB2, 0xB2, + 0xB2, 0xB2, 0xB2, 0xB2, 0x2F, 0xA3, 0xA3, 0xA3, + 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0xAD, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0xA7, 0x4C, 0xCE, 0xDA, 0x20, + 0xA6, 0x2F, 0x66, 0x66, 0xA3, 0x2F, 0xB2, 0xB2, + 0x2F, 0x66, 0x8F, 0x8F, 0x8F, 0x66, 0xA3, 0xA3, + 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0x2F, 0xA3, + 0xA3, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, + 0xA3, 0x98, 0x66, 0x2F, 0xB2, 0xB2, 0x2F, 0x98, + 0x8F, 0x8F, 0x98, 0x66, 0xA3, 0xB2, 0xB2, 0xB2, + 0x2F, 0x2F, 0x2F, 0x2F, 0xA3, 0x2F, 0xA3, 0xA3, + 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0x51, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0xCE, 0x55, 0xAD, 0xA7, 0x54, + 0x20, 0x8F, 0xA3, 0x98, 0x66, 0x2F, 0xB2, 0xB2, + 0x2F, 0x98, 0x8F, 0x8F, 0x98, 0x66, 0xA3, 0xB2, + 0xB2, 0xB2, 0x2F, 0x2F, 0x2F, 0x2F, 0xA3, 0x2F, + 0xA3, 0xA3, 0xA3, 0x2F, 0xA3, 0xA3, 0xA3, 0xA3, + 0xA3, 0x8F, 0x66, 0x2F, 0xB2, 0x51, 0x2F, 0x98, + 0xA0, 0x8F, 0x66, 0xA3, 0x2F, 0x51, 0x51, 0xB2, + 0xA3, 0xA3, 0xA3, 0x2F, 0xA3, 0xA3, 0x66, 0x66, + 0x98, 0x98, 0x98, 0x66, 0x98, 0x66, 0x55, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0xCE, 0x4C, 0x9C, 0x2E, 0xDA, + 0x20, 0xDA, 0x51, 0x8F, 0x66, 0x2F, 0xB2, 0x51, + 0x2F, 0x98, 0xA0, 0x8F, 0x66, 0xA3, 0x2F, 0x51, + 0x51, 0xB2, 0xA3, 0xA3, 0xA3, 0x2F, 0xA3, 0xA3, + 0x66, 0x66, 0x98, 0x98, 0x98, 0x98, 0x98, 0x66, + 0x51, 0x66, 0x2F, 0xB2, 0x51, 0xB2, 0xA3, 0xA0, + 0xA0, 0x66, 0xA3, 0xB2, 0xB2, 0xB2, 0xB2, 0xA3, + 0x66, 0x66, 0x66, 0xA3, 0xA3, 0x66, 0x98, 0x98, + 0x98, 0x98, 0x98, 0x66, 0x66, 0xB2, 0x6D, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6D, 0x3A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0xA5, 0x66, 0x2F, 0xB2, 0x51, 0xB2, + 0xA3, 0xA0, 0xA0, 0x66, 0xA3, 0xB2, 0xB2, 0xB2, + 0xB2, 0xA3, 0x66, 0x66, 0x66, 0xA3, 0xA3, 0x66, + 0x98, 0x98, 0x8F, 0x98, 0x66, 0x66, 0x66, 0x66, + 0x51, 0x2F, 0xB2, 0x51, 0x51, 0x2F, 0x66, 0xA0, + 0x8F, 0xA3, 0x2F, 0xB2, 0xB2, 0x2F, 0x2F, 0x66, + 0x98, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x2F, 0xA3, 0x2F, 0x2F, 0x51, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0xDA, 0x51, 0xB2, 0x51, 0x51, 0x2F, + 0x66, 0xA0, 0x8F, 0xA3, 0x2F, 0xB2, 0xB2, 0x2F, + 0x2F, 0x66, 0x98, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, + 0x51, 0x2F, 0xB2, 0x51, 0x2F, 0xA3, 0x8F, 0x8F, + 0x98, 0xA3, 0xB2, 0xB2, 0x2F, 0xA3, 0x98, 0x66, + 0x98, 0x98, 0x66, 0x66, 0x66, 0x66, 0xA3, 0x2F, + 0xB2, 0xB2, 0x51, 0xB2, 0xB2, 0x66, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0xA3, 0xB2, 0x51, 0x2F, 0xA3, + 0x8F, 0x8F, 0x98, 0xA3, 0xB2, 0xB2, 0x2F, 0xA3, + 0x98, 0x66, 0x98, 0x98, 0x66, 0x66, 0x66, 0x66, + 0xA3, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, + 0xB2, 0x2F, 0xA3, 0x2F, 0x66, 0x98, 0x8F, 0x98, + 0xA3, 0x2F, 0x2F, 0xA3, 0x98, 0x98, 0x98, 0x98, + 0x66, 0x98, 0x66, 0x98, 0x66, 0xA3, 0x2F, 0xB2, + 0x51, 0x51, 0x51, 0xB2, 0xB2, 0x8F, 0x20, 0x20, + 0x20, 0x54, 0x6D, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x54, 0x6D, 0x6D, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x4C, 0xA3, 0x2F, 0x66, 0x98, + 0x8F, 0x98, 0xA3, 0x2F, 0x2F, 0xA3, 0x98, 0x98, + 0x98, 0x98, 0x66, 0x98, 0x66, 0x98, 0x66, 0xA3, + 0x2F, 0xB2, 0x51, 0x51, 0x51, 0xB2, 0x2F, 0x2F, + 0x2F, 0xA3, 0xA3, 0x66, 0x98, 0x98, 0x8F, 0x98, + 0x2F, 0x2F, 0x2F, 0x66, 0x8F, 0x8F, 0x98, 0xA3, + 0x66, 0x66, 0x8F, 0x98, 0x98, 0x66, 0x2F, 0xB2, + 0x51, 0xB2, 0x2F, 0xA3, 0xA3, 0xA0, 0x20, 0x20, + 0xDA, 0x2E, 0x3A, 0xA7, 0x20, 0x20, 0x20, 0x20, + 0x20, 0xCE, 0x2A, 0x2A, 0x2E, 0xA7, 0xDA, 0x20, + 0x20, 0x20, 0x20, 0x9C, 0xA3, 0x66, 0x98, 0x98, + 0x8F, 0x98, 0x2F, 0x2F, 0x2F, 0x66, 0x8F, 0x8F, + 0x98, 0xA3, 0x66, 0x66, 0x8F, 0x98, 0x98, 0x66, + 0x2F, 0xB2, 0x51, 0xB2, 0x2F, 0x2F, 0xA3, 0xA3, + 0xB2, 0xA3, 0x66, 0x98, 0x8F, 0x8F, 0x66, 0xA3, + 0x2F, 0x2F, 0x66, 0x98, 0x98, 0x66, 0x2F, 0x2F, + 0xA3, 0x98, 0x8F, 0x98, 0x66, 0x2F, 0xB2, 0xB2, + 0xB2, 0xA3, 0x66, 0x66, 0x66, 0x98, 0x20, 0x3A, + 0x98, 0x89, 0x8F, 0x6D, 0x20, 0x20, 0x20, 0x20, + 0x4C, 0x66, 0x51, 0x44, 0x51, 0x2E, 0x54, 0x20, + 0x20, 0x20, 0x20, 0xA7, 0x66, 0x98, 0x8F, 0x8F, + 0x66, 0xA3, 0x2F, 0x2F, 0x66, 0x98, 0x98, 0x66, + 0x2F, 0x2F, 0xA3, 0x98, 0x8F, 0x98, 0x66, 0x2F, + 0xB2, 0xB2, 0xB2, 0xA3, 0x66, 0x66, 0x66, 0xA3, + 0x2F, 0x66, 0x98, 0x8F, 0x8F, 0x98, 0x66, 0x2F, + 0x2F, 0xA3, 0x66, 0x98, 0x98, 0xA3, 0x2F, 0xB2, + 0xA3, 0x8F, 0x98, 0xA3, 0xB2, 0x51, 0x89, 0x89, + 0xB2, 0xA3, 0x66, 0x98, 0x66, 0x98, 0x20, 0xA6, + 0x44, 0x39, 0xE6, 0x98, 0x20, 0x20, 0x20, 0x9C, + 0x74, 0xD6, 0x7E, 0xD6, 0x39, 0x8F, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x2E, 0x98, 0x8F, 0x8F, 0x98, + 0x66, 0x2F, 0x2F, 0xA3, 0x66, 0x98, 0x98, 0xA3, + 0x2F, 0xB2, 0x66, 0x98, 0x8F, 0xA3, 0xB2, 0x51, + 0x89, 0x89, 0xB2, 0xA3, 0x66, 0x98, 0x66, 0x66, + 0x2F, 0x66, 0x8F, 0xA0, 0x8F, 0x98, 0xA3, 0xB2, + 0x2F, 0x66, 0x66, 0x66, 0xA3, 0x2F, 0x2F, 0x2F, + 0x66, 0x98, 0xA3, 0xB2, 0x89, 0x44, 0x89, 0x51, + 0x2F, 0x66, 0x98, 0x98, 0xA3, 0x66, 0x20, 0x2F, + 0x2F, 0xAD, 0x89, 0xD6, 0x3A, 0x20, 0x20, 0x55, + 0x6B, 0x51, 0x6D, 0x4C, 0xD8, 0xD6, 0x2E, 0x20, + 0x20, 0x20, 0x20, 0x54, 0x8F, 0xA0, 0x8F, 0x98, + 0xA3, 0xB2, 0x2F, 0x66, 0x66, 0x66, 0xA3, 0x2F, + 0xB2, 0x2F, 0x66, 0x66, 0xA3, 0xB2, 0x89, 0x44, + 0x89, 0x51, 0x2F, 0x66, 0x98, 0x98, 0xA3, 0xA3, + 0xA3, 0x66, 0x8F, 0xA0, 0x8F, 0x66, 0x2F, 0xB2, + 0xA3, 0x66, 0x98, 0x66, 0xA3, 0x2F, 0x2F, 0xA3, + 0xA3, 0x2F, 0xB2, 0x89, 0xD8, 0xD8, 0x51, 0x66, + 0x8F, 0xA0, 0xA0, 0x8F, 0x98, 0xA3, 0x20, 0x44, + 0xA7, 0xCE, 0xA6, 0x4D, 0xCE, 0x6D, 0xA7, 0xA0, + 0x6B, 0xA7, 0x20, 0x92, 0xAD, 0x6B, 0x4C, 0x20, + 0x20, 0x20, 0x20, 0x54, 0x98, 0xA0, 0x8F, 0x66, + 0x2F, 0xB2, 0xA3, 0x66, 0x98, 0x66, 0xA3, 0x2F, + 0x2F, 0xA3, 0xA3, 0xA3, 0xB2, 0x89, 0xD8, 0xD8, + 0x51, 0x66, 0x8F, 0xA0, 0xA0, 0x8F, 0x98, 0x66, + 0x66, 0x66, 0x8F, 0x55, 0x8F, 0xA3, 0xB2, 0xB2, + 0xA3, 0x66, 0x66, 0xA3, 0x2F, 0xA3, 0xA3, 0xA3, + 0xA3, 0xB2, 0x89, 0x44, 0x44, 0x51, 0x66, 0xA0, + 0x55, 0xA5, 0x55, 0x8F, 0x66, 0xA3, 0x20, 0x44, + 0x6D, 0x54, 0xA7, 0x74, 0x2E, 0x4B, 0xBF, 0x9C, + 0x7E, 0xDA, 0x20, 0x54, 0x2E, 0x6B, 0x2A, 0x20, + 0x20, 0x20, 0x20, 0x3A, 0x8F, 0x55, 0x8F, 0xA3, + 0xB2, 0xB2, 0xA3, 0x66, 0x66, 0xA3, 0xA3, 0x2F, + 0xA3, 0xA3, 0xA3, 0xB2, 0x89, 0x44, 0x44, 0x51, + 0x66, 0xA0, 0xA5, 0xA5, 0x55, 0x8F, 0x66, 0x66, + 0xA0, 0xA0, 0xA0, 0xA0, 0x8F, 0xA3, 0x2F, 0xB2, + 0x66, 0x98, 0xA3, 0x2F, 0x2F, 0xB2, 0x2F, 0x2F, + 0xB2, 0x51, 0x89, 0x89, 0xB2, 0x98, 0xA0, 0x2A, + 0xA5, 0x55, 0x98, 0x66, 0xA3, 0xB2, 0x20, 0x2F, + 0x4C, 0x20, 0x4B, 0xBB, 0xCF, 0x6F, 0x27, 0x36, + 0x93, 0xCE, 0x20, 0x20, 0xA6, 0x3D, 0x4C, 0x20, + 0x20, 0x20, 0x20, 0xDA, 0xA0, 0xA0, 0x8F, 0xA3, + 0x2F, 0xB2, 0x66, 0x98, 0xA3, 0x2F, 0xB2, 0x2F, + 0x2F, 0x2F, 0xB2, 0x51, 0x89, 0x89, 0xB2, 0x98, + 0xA0, 0x2A, 0xA5, 0xA0, 0x8F, 0x66, 0xA3, 0xA3, + 0xA0, 0x8F, 0x8F, 0xA0, 0x8F, 0xA3, 0xB2, 0x2F, + 0x66, 0x98, 0x2F, 0xB2, 0xB2, 0xB2, 0xB2, 0x2F, + 0xB2, 0x89, 0x44, 0x51, 0x66, 0x55, 0xAD, 0x2A, + 0x55, 0x8F, 0x66, 0xA3, 0x2F, 0xB2, 0x20, 0x2A, + 0xE6, 0x95, 0xE5, 0x5A, 0x52, 0x52, 0x3F, 0x27, + 0x22, 0xC7, 0x9D, 0x60, 0xA2, 0xA2, 0x3A, 0x20, + 0x20, 0x20, 0x20, 0x54, 0x66, 0xA0, 0x8F, 0xA3, + 0xB2, 0x2F, 0x66, 0x98, 0x2F, 0xB2, 0xB2, 0xB2, + 0xB2, 0x2F, 0xB2, 0x89, 0x44, 0x51, 0x66, 0x55, + 0x2A, 0x2A, 0xA5, 0x8F, 0x66, 0xA3, 0x2F, 0x2F, + 0xA3, 0xA3, 0x66, 0x98, 0x98, 0x2F, 0xB2, 0xB2, + 0xA3, 0xA3, 0x2F, 0x51, 0x51, 0x51, 0x2F, 0x2F, + 0x51, 0x89, 0x89, 0x2F, 0x8F, 0x2A, 0x2A, 0xA5, + 0x8F, 0x66, 0xA3, 0xB2, 0x2F, 0x51, 0x20, 0x6D, + 0x77, 0xF7, 0xEE, 0x30, 0xB0, 0x72, 0x72, 0x5B, + 0x82, 0xEA, 0x72, 0xB0, 0x90, 0x96, 0x71, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x2F, 0x98, 0x98, 0x2F, + 0xB2, 0xB2, 0x66, 0xA3, 0x2F, 0x51, 0x51, 0xB2, + 0xB2, 0x2F, 0x51, 0x89, 0x89, 0x2F, 0x8F, 0x2A, + 0xAD, 0xA5, 0x98, 0x66, 0xA3, 0xB2, 0x2F, 0xB2, + 0xD8, 0xB2, 0xA3, 0x98, 0x98, 0x2F, 0xB2, 0xB2, + 0x66, 0xA3, 0xB2, 0x51, 0x51, 0xB2, 0x2F, 0xA3, + 0x51, 0x89, 0x89, 0xA3, 0xA0, 0x2A, 0xA5, 0x8F, + 0x66, 0xA3, 0x2F, 0xB2, 0xB2, 0x51, 0x20, 0x69, + 0x64, 0xF9, 0x3F, 0x52, 0x52, 0x72, 0x29, 0x82, + 0x47, 0x47, 0x47, 0x8B, 0x72, 0xB7, 0x60, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x2F, 0x98, 0x98, 0x2F, + 0xB2, 0xB2, 0xA3, 0xA3, 0xB2, 0x89, 0x51, 0x2F, + 0x2F, 0xA3, 0x51, 0x89, 0x89, 0xA3, 0xA0, 0x2A, + 0xA5, 0x8F, 0x66, 0xA3, 0x2F, 0xB2, 0xB2, 0xB2, + 0xDD, 0xA3, 0x66, 0x98, 0x66, 0x2F, 0xB2, 0xB2, + 0xA3, 0xA3, 0xB2, 0x51, 0xB2, 0x2F, 0xA3, 0x2F, + 0xB2, 0x89, 0xB2, 0x66, 0xA0, 0xA5, 0x8F, 0x98, + 0x66, 0x66, 0xB2, 0x51, 0x51, 0x51, 0x81, 0xFA, + 0x62, 0xEE, 0x30, 0x52, 0x22, 0x72, 0x82, 0x82, + 0x47, 0x47, 0xEA, 0x3F, 0x37, 0x6F, 0x26, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x2A, 0x98, 0x66, 0x2F, + 0x51, 0xB2, 0xA3, 0x66, 0xB2, 0x51, 0x51, 0xB2, + 0xA3, 0x2F, 0xB2, 0x89, 0xB2, 0x66, 0x55, 0x55, + 0x8F, 0x98, 0x66, 0xA3, 0xB2, 0x51, 0x51, 0xB2, + 0x74, 0xA0, 0x8F, 0x98, 0x66, 0xB2, 0xB2, 0xB2, + 0xA3, 0xA3, 0x2F, 0x51, 0x51, 0x2F, 0xA3, 0x2F, + 0xB2, 0x51, 0xA3, 0x98, 0xA0, 0x55, 0xA0, 0xA0, + 0x8F, 0x66, 0x2F, 0x51, 0xB2, 0x51, 0x54, 0xA9, + 0x62, 0xEF, 0x52, 0x22, 0x72, 0x29, 0xEA, 0xEA, + 0x29, 0x22, 0x37, 0x37, 0x8E, 0xCF, 0x49, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6D, 0x2F, 0x66, 0x2F, + 0x51, 0xB2, 0xA3, 0x66, 0x2F, 0xB2, 0xB2, 0x2F, + 0xA3, 0x2F, 0xB2, 0x51, 0x2F, 0x98, 0xA0, 0x55, + 0xA0, 0xA0, 0x8F, 0x66, 0x2F, 0x51, 0xB2, 0xA3, + 0xA3, 0x2A, 0xA5, 0x98, 0xA3, 0x2F, 0xB2, 0x2F, + 0x66, 0x66, 0x2F, 0xB2, 0xB2, 0xB2, 0x2F, 0x2F, + 0xB2, 0x2F, 0xA3, 0x8F, 0xA0, 0xA0, 0xA0, 0xA0, + 0x8F, 0xA3, 0x51, 0x51, 0x2F, 0xB2, 0x54, 0xA8, + 0x65, 0x5C, 0x52, 0x22, 0x29, 0x29, 0x29, 0xB0, + 0x62, 0x56, 0xF9, 0x79, 0xF9, 0xBB, 0x4B, 0x20, + 0x6D, 0xA5, 0x2E, 0x20, 0x20, 0xA3, 0xA3, 0x2F, + 0xB2, 0x2F, 0xA3, 0x66, 0x2F, 0xB2, 0xB2, 0xB2, + 0x2F, 0x2F, 0xB2, 0x2F, 0x66, 0x8F, 0xA0, 0xA0, + 0x55, 0xA0, 0x8F, 0xA3, 0x51, 0x51, 0x2F, 0xA3, + 0xA0, 0x2A, 0x55, 0x66, 0xA3, 0x2F, 0xB2, 0xB2, + 0xA3, 0x66, 0xA3, 0xB2, 0xB2, 0xB2, 0xA3, 0x66, + 0xA3, 0xA3, 0x66, 0x8F, 0x8F, 0x8F, 0xA0, 0x98, + 0xA3, 0x51, 0x89, 0x89, 0xA3, 0x2F, 0x20, 0x54, + 0xDF, 0xFA, 0x40, 0x37, 0xD4, 0x43, 0x56, 0x64, + 0x76, 0xF9, 0x78, 0x41, 0x5E, 0x5E, 0x4C, 0x20, + 0x20, 0xAD, 0x8F, 0x9C, 0x20, 0xA5, 0xA3, 0x2F, + 0x2F, 0x2F, 0xA3, 0x66, 0x2F, 0xB2, 0xB2, 0xB2, + 0xA3, 0x66, 0xA3, 0x2F, 0x66, 0x8F, 0x8F, 0x8F, + 0x8F, 0x8F, 0xA3, 0x51, 0x89, 0x51, 0xA3, 0x66, + 0xA0, 0xA0, 0x8F, 0xA3, 0x2F, 0x2F, 0x2F, 0xB2, + 0x2F, 0xA3, 0x2F, 0xB2, 0x51, 0xB2, 0x2F, 0x66, + 0xA3, 0xA3, 0x66, 0x66, 0x66, 0x66, 0x66, 0xA3, + 0xB2, 0x89, 0xD8, 0x51, 0x66, 0x51, 0x20, 0x6D, + 0x51, 0x77, 0x9F, 0xF7, 0xEE, 0x8E, 0xF9, 0xF0, + 0x24, 0xF7, 0x77, 0x5E, 0x74, 0xD8, 0x98, 0x20, + 0x20, 0x2E, 0x55, 0x92, 0x20, 0x54, 0x51, 0x2F, + 0x2F, 0xB2, 0xB2, 0xA3, 0x2F, 0x51, 0x51, 0xB2, + 0xA3, 0xA3, 0x66, 0xA3, 0x66, 0x66, 0x66, 0x66, + 0x66, 0xA3, 0xB2, 0x89, 0xD8, 0x51, 0xA3, 0x98, + 0x98, 0x66, 0x66, 0xA3, 0x2F, 0x2F, 0x2F, 0xB2, + 0xB2, 0x2F, 0x2F, 0xB2, 0xB2, 0x2F, 0x2F, 0x66, + 0x66, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0xB2, + 0x89, 0xD8, 0x89, 0xB2, 0x66, 0x66, 0x20, 0x6D, + 0x89, 0xC2, 0xA4, 0x96, 0xC6, 0x64, 0x50, 0x40, + 0xF4, 0x97, 0x89, 0x74, 0x7E, 0x6B, 0x39, 0xA7, + 0x20, 0x20, 0x3A, 0x54, 0x20, 0x20, 0xA7, 0x51, + 0x2F, 0xB2, 0xB2, 0xA3, 0xA3, 0xB2, 0xB2, 0xB2, + 0xA3, 0xA3, 0x66, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, + 0x2F, 0xB2, 0x89, 0xD8, 0x44, 0x2F, 0x66, 0x66, + 0x2F, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, 0xB2, + 0x2F, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0xA3, + 0x66, 0xA3, 0x2F, 0xB2, 0xB2, 0xB2, 0x51, 0x51, + 0x89, 0x89, 0xB2, 0x66, 0x2F, 0x6D, 0x20, 0xCE, + 0x39, 0x74, 0x89, 0x5E, 0xBD, 0x87, 0xC8, 0xD1, + 0x89, 0x44, 0x3C, 0x4D, 0x6B, 0x6B, 0x6B, 0x2F, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xA3, + 0x2F, 0x2F, 0x2F, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, + 0x2F, 0xA3, 0x66, 0x66, 0x2F, 0xB2, 0xB2, 0xB2, + 0x51, 0x51, 0x89, 0x89, 0xB2, 0xA3, 0x98, 0x66, + 0xA3, 0x66, 0x66, 0xA3, 0xA3, 0xA3, 0xA3, 0x2F, + 0x2F, 0xA3, 0xA3, 0xA3, 0x2F, 0xA3, 0x2F, 0xA3, + 0x66, 0x66, 0x2F, 0x2F, 0xB2, 0xB2, 0xB2, 0xB2, + 0xB2, 0x2F, 0x66, 0x66, 0x2A, 0x20, 0x54, 0x44, + 0x6B, 0x39, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, + 0xD8, 0x39, 0x4D, 0x6B, 0x6B, 0x6B, 0x6B, 0x4D, + 0x9C, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6D, + 0x51, 0x2F, 0x2F, 0x2F, 0xA3, 0xA3, 0xA3, 0x2F, + 0xA3, 0xA3, 0x66, 0xA3, 0x2F, 0xB2, 0xB2, 0xB2, + 0xB2, 0xB2, 0xB2, 0x2F, 0x66, 0x98, 0x98, 0x66, + 0x98, 0x98, 0x66, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, + 0x2F, 0x2F, 0xA3, 0xA3, 0x66, 0xA3, 0xA3, 0x66, + 0x98, 0x66, 0x66, 0x2F, 0xA3, 0xA3, 0xA3, 0xA3, + 0x66, 0x98, 0x98, 0x98, 0x3A, 0x54, 0x2A, 0x6B, + 0x6B, 0x6B, 0x83, 0x44, 0x89, 0x89, 0x44, 0x3C, + 0xD6, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, + 0xB2, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0xAD, 0x2F, 0x2F, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, + 0xA3, 0x66, 0x66, 0x98, 0x66, 0xA3, 0xA3, 0xA3, + 0xA3, 0xA3, 0x66, 0x98, 0x8F, 0x8F, 0x8F, 0x98, + 0x8F, 0x98, 0x98, 0x66, 0xA3, 0xA3, 0xA3, 0xA3, + 0x2F, 0xA3, 0xA3, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x8F, 0x8F, 0x8F, 0x98, 0x98, 0x98, 0x8F, 0xA0, + 0xA0, 0xA0, 0xA3, 0xDA, 0x20, 0x3A, 0x39, 0x6B, + 0x6B, 0x6B, 0x4D, 0xA2, 0x74, 0x3C, 0x7E, 0x6B, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, + 0x6B, 0x2E, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x2F, 0x2F, 0xA3, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x98, 0x8F, 0x8F, 0x98, 0x98, 0x98, 0x98, + 0x8F, 0xA0, 0xA0, 0xA0, 0x8F, 0x8F, 0x8F, 0xA0, + 0x8F, 0x66, 0x66, 0xA3, 0x66, 0xA3, 0xA3, 0x2F, + 0x2F, 0x2F, 0xA3, 0xA3, 0x66, 0x66, 0x66, 0x98, + 0x98, 0xA0, 0x98, 0x66, 0x66, 0x98, 0x8F, 0xA0, + 0xA0, 0xA3, 0x2E, 0x20, 0x20, 0x8F, 0x6B, 0x6B, + 0x6B, 0x6B, 0x6B, 0x6B, 0x3D, 0x6B, 0x6B, 0x6B, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, + 0x6B, 0x55, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3A, 0x51, 0x2F, 0xA3, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x98, 0x8F, 0x8F, 0x98, 0x66, 0x98, + 0x8F, 0xA0, 0xA0, 0x8F, 0x8F, 0x8F, 0x8F, 0xA0, + 0x66, 0x2F, 0x2F, 0x2F, 0x2F, 0xA3, 0xA3, 0xA3, + 0x2F, 0x2F, 0xA3, 0xA3, 0x66, 0xA3, 0x66, 0x66, + 0x66, 0x98, 0xA3, 0x2F, 0x2F, 0xA3, 0x66, 0x8F, + 0x66, 0xA6, 0x20, 0x20, 0x6D, 0x39, 0x6B, 0x6B, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, + 0x6B, 0xB2, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x2E, 0x89, 0xA3, 0xA3, 0x66, 0x66, + 0x66, 0x66, 0x98, 0x98, 0xA3, 0x2F, 0x2F, 0xA3, + 0x66, 0x8F, 0x98, 0x98, 0x66, 0x98, 0x98, 0x8F, + 0x2F, 0x51, 0xB2, 0xB2, 0x2F, 0xA3, 0xA3, 0xA3, + 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, + 0xA3, 0xA3, 0x2F, 0xB2, 0x2F, 0xA3, 0x66, 0x2F, + 0x55, 0x20, 0x20, 0x20, 0x4C, 0x39, 0x6B, 0x6B, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, + 0x4D, 0x7E, 0x54, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x2E, 0x51, 0xA3, 0xA3, 0xA3, + 0xA3, 0xA3, 0xA3, 0x2F, 0xB2, 0xB2, 0x2F, 0xA3, + 0x66, 0x66, 0xA3, 0xA3, 0xA3, 0xA3, 0x66, 0x66, + 0xB2, 0x51, 0x51, 0xB2, 0xB2, 0xA3, 0x2F, 0xA3, + 0x2F, 0x2F, 0x2F, 0xA3, 0xA3, 0xA3, 0xA3, 0x66, + 0xA3, 0x2F, 0xB2, 0x2F, 0xA3, 0x98, 0x98, 0xA0, + 0x20, 0x20, 0x20, 0x20, 0xA5, 0x83, 0x6B, 0x6B, + 0x6B, 0x6B, 0x6B, 0x4D, 0x7E, 0x4D, 0x6B, 0x6B, + 0x6B, 0x6B, 0x6B, 0x4D, 0x4D, 0xD6, 0x7E, 0xDD, + 0x3C, 0x39, 0xA7, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x92, 0xB2, 0xA3, 0xA3, + 0xA3, 0x66, 0xA3, 0x2F, 0x2F, 0x2F, 0xA3, 0x98, + 0x98, 0x66, 0xA3, 0xA3, 0x66, 0x66, 0x66, 0xA3, + 0x89, 0x89, 0x51, 0xB2, 0xB2, 0x2F, 0x2F, 0x2F, + 0x2F, 0xA3, 0xA3, 0x2F, 0xA3, 0xA3, 0xA3, 0xA3, + 0xA3, 0xA3, 0xA3, 0x66, 0x8F, 0x8F, 0x2F, 0xDA, + 0x20, 0x20, 0x20, 0xDA, 0xA0, 0x51, 0x3C, 0x7E, + 0x6B, 0x6B, 0x6B, 0x4D, 0x7E, 0x6B, 0x6B, 0x6B, + 0x6B, 0x6B, 0x6B, 0x7E, 0x3C, 0xD8, 0x44, 0xD8, + 0x44, 0x83, 0x89, 0xDA, 0x20, 0x3A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0xB2, 0xA3, 0xA3, + 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0x66, 0x8F, 0x8F, + 0x98, 0x98, 0x98, 0x98, 0x66, 0xA3, 0xA3, 0x2F, + 0x3C, 0x89, 0x89, 0x51, 0xB2, 0xB2, 0x2F, 0x2F, + 0x2F, 0x2F, 0xA3, 0xA3, 0x66, 0x66, 0x66, 0xA3, + 0xA3, 0xA3, 0xA3, 0x66, 0x98, 0x98, 0xA3, 0x20, + 0x20, 0x20, 0x20, 0x6D, 0x2F, 0xE6, 0x6B, 0x6B, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x3D, 0xD6, 0x3D, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x4D, 0x7E, 0xA2, + 0x74, 0x44, 0xA2, 0xA3, 0x20, 0x3A, 0x2E, 0x6D, + 0x20, 0x20, 0x20, 0x20, 0x20, 0xA6, 0xA3, 0x66, + 0x66, 0x66, 0xA3, 0x2F, 0xA3, 0x66, 0x66, 0x98, + 0x66, 0x66, 0x98, 0x98, 0x98, 0x66, 0xA3, 0xA3, + 0x83, 0xB2, 0x2F, 0x2F, 0xB2, 0xB2, 0xB2, 0x2F, + 0x2F, 0x2F, 0xA3, 0x66, 0x66, 0x98, 0x98, 0x66, + 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0x66, 0xA6, 0x20, + 0x3A, 0x3A, 0x54, 0x55, 0x7E, 0x6B, 0x6B, 0x6B, + 0x4D, 0x3D, 0x6B, 0x6B, 0x6B, 0x57, 0x33, 0xEB, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, + 0x4D, 0xA2, 0x74, 0x39, 0x92, 0x20, 0x20, 0x6D, + 0x2E, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2F, 0x98, + 0x98, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0xA3, 0x66, 0xA3, + 0x89, 0xA3, 0x66, 0x66, 0xA3, 0xA3, 0x2F, 0x2F, + 0xA3, 0x2F, 0xA3, 0xA3, 0x66, 0x66, 0x66, 0xA3, + 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xB2, 0x3A, 0x20, + 0xA7, 0x20, 0x3A, 0x39, 0x6B, 0x6B, 0x6B, 0x6B, + 0xB5, 0xCB, 0x6B, 0x6B, 0x3D, 0x8A, 0x42, 0x3D, + 0x6B, 0x6B, 0x6B, 0x84, 0x6C, 0x4D, 0x6B, 0x6B, + 0x6B, 0x6B, 0x7E, 0x83, 0x51, 0x20, 0x20, 0x20, + 0x6D, 0x3A, 0x20, 0x20, 0x20, 0x20, 0xAD, 0x66, + 0x66, 0x66, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, + 0xA3, 0xA3, 0xA3, 0xA3, 0x66, 0xA3, 0xA3, 0xA3, + 0xB2, 0x98, 0x66, 0x66, 0x98, 0x66, 0x66, 0xA3, + 0xA3, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, + 0xA3, 0x2F, 0xA3, 0xA3, 0xA3, 0x2F, 0x20, 0x6D, + 0x3A, 0x20, 0x98, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, + 0xAA, 0x33, 0x6B, 0x6B, 0x3D, 0xF5, 0x7B, 0x3D, + 0x6B, 0x6B, 0x4F, 0x4A, 0x58, 0x3D, 0x6B, 0x6B, + 0x6B, 0x6B, 0x6B, 0x7E, 0x7E, 0x9C, 0x54, 0xA7, + 0x2E, 0xA7, 0x20, 0x20, 0x20, 0x20, 0x54, 0x51, + 0x2F, 0x2F, 0xA3, 0x2F, 0xA3, 0xA3, 0xA3, 0xA3, + 0x2F, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0x2F, + 0xB2, 0x66, 0x66, 0x66, 0x66, 0xA3, 0x66, 0xA3, + 0x66, 0x66, 0xA3, 0x2F, 0x2F, 0xB2, 0x2F, 0xB2, + 0x2F, 0x2F, 0x2F, 0xA3, 0x2F, 0xA6, 0x20, 0xCE, + 0x20, 0x6D, 0x4D, 0x6B, 0xD6, 0x7E, 0x6B, 0x6B, + 0x6E, 0x9A, 0x57, 0x6B, 0x2D, 0x7B, 0x7B, 0x3D, + 0x6B, 0x84, 0xF5, 0x7B, 0x84, 0x6B, 0x6B, 0x6B, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x98, 0x3A, 0x9C, + 0xCE, 0x3A, 0x2E, 0x20, 0x20, 0x20, 0x20, 0x98, + 0xB2, 0xB2, 0x2F, 0x2F, 0x2F, 0xA3, 0x2F, 0x2F, + 0x2F, 0xA3, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, + 0x89, 0xA3, 0x66, 0x66, 0xA3, 0x2F, 0x2F, 0xA3, + 0x66, 0x66, 0xA3, 0xA3, 0x2F, 0x2F, 0xB2, 0xB2, + 0xB2, 0x2F, 0x2F, 0x2F, 0x89, 0x54, 0x6D, 0x3A, + 0x20, 0x98, 0x6B, 0x6B, 0xE0, 0xB4, 0x6B, 0x6B, + 0x2D, 0x9E, 0x4A, 0x3D, 0x84, 0xF5, 0xF5, 0x84, + 0x6B, 0x6E, 0x59, 0x6C, 0x6B, 0x6B, 0x6B, 0x6B, + 0x3D, 0x6B, 0x6B, 0x6B, 0x6B, 0xDD, 0xDA, 0x6D, + 0x54, 0x20, 0xCE, 0x20, 0x20, 0x20, 0x20, 0xA7, + 0x51, 0xB2, 0xB2, 0xB2, 0x2F, 0xB2, 0x2F, 0x2F, + 0x2F, 0x66, 0x66, 0xA3, 0xA3, 0xA3, 0xA3, 0x66, + 0x89, 0xA3, 0xA3, 0xA3, 0x2F, 0xB2, 0xB2, 0x2F, + 0x66, 0x66, 0xA3, 0xA3, 0x2F, 0xA3, 0xA3, 0x2F, + 0xB2, 0x2F, 0x2F, 0xA3, 0x98, 0x20, 0xA7, 0x20, + 0x3A, 0x7E, 0x6B, 0x6B, 0x7F, 0xDE, 0xF6, 0x3D, + 0x6B, 0xDB, 0x8A, 0xDB, 0xE9, 0xF3, 0xF3, 0xDB, + 0x68, 0xF3, 0x73, 0x7F, 0x6B, 0x6B, 0x57, 0x58, + 0xDC, 0x2D, 0x6B, 0x6B, 0x6B, 0x6B, 0x3A, 0x20, + 0x20, 0x20, 0x6D, 0x54, 0x20, 0x20, 0x20, 0x20, + 0x51, 0x2F, 0x2F, 0x2F, 0xA3, 0xA3, 0xA3, 0x66, + 0xA3, 0x66, 0x98, 0x98, 0x66, 0x98, 0x98, 0x66, + 0x2F, 0x66, 0x66, 0xA3, 0x2F, 0xB2, 0x2F, 0xA3, + 0xA3, 0xA3, 0xA3, 0xA3, 0x66, 0xA3, 0xA3, 0xA3, + 0x66, 0x98, 0x8F, 0x98, 0xCE, 0xDA, 0x2E, 0x20, + 0x2A, 0x6B, 0x6B, 0x6B, 0x6B, 0x2C, 0x34, 0xCB, + 0xEB, 0x6C, 0x31, 0x59, 0x82, 0x82, 0x8B, 0x82, + 0xF3, 0x73, 0xE9, 0x6B, 0x3D, 0x6E, 0xF3, 0x4A, + 0x4F, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x92, 0x20, + 0x20, 0x20, 0x6D, 0x6D, 0x20, 0x20, 0x20, 0x20, + 0xA3, 0xA3, 0x66, 0x98, 0x98, 0x8F, 0x8F, 0x98, + 0x98, 0x98, 0x98, 0x66, 0x98, 0x66, 0x66, 0xA3, + 0xA3, 0x66, 0x66, 0x66, 0xA3, 0x2F, 0x2F, 0xA3, + 0xA3, 0xA3, 0x66, 0x66, 0xA3, 0xA3, 0xA3, 0x66, + 0x8F, 0x55, 0xA5, 0x98, 0x20, 0x2E, 0x54, 0x54, + 0x89, 0x6B, 0x6B, 0x6B, 0x6B, 0x84, 0xE3, 0x4A, + 0x58, 0x42, 0x5B, 0x8B, 0x82, 0x82, 0x82, 0x82, + 0x82, 0x59, 0x58, 0x57, 0x57, 0x59, 0x7B, 0x84, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0xAD, 0x20, + 0x20, 0x20, 0x3A, 0x3A, 0x20, 0x20, 0x20, 0x20, + 0x2A, 0x66, 0x8F, 0x55, 0xA5, 0xA5, 0xA0, 0x8F, + 0x66, 0xA3, 0xA3, 0x66, 0x98, 0x66, 0x66, 0x2F, + 0x2F, 0x2F, 0x2F, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, + 0xA3, 0x2F, 0xA3, 0xA3, 0x66, 0xA3, 0xA3, 0x66, + 0x8F, 0xA5, 0x8F, 0x2E, 0x20, 0x2E, 0x20, 0x3A, + 0x4D, 0x6B, 0xE6, 0x84, 0x3D, 0x6B, 0xEB, 0x4A, + 0xC9, 0x8B, 0x8B, 0x31, 0x59, 0x82, 0x59, 0x59, + 0x5B, 0x82, 0x59, 0x73, 0x7B, 0xDC, 0x57, 0x6B, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x55, 0x20, + 0x20, 0x20, 0x6D, 0xDA, 0x20, 0x20, 0x20, 0x20, + 0x9C, 0x66, 0x8F, 0xA5, 0xA5, 0x55, 0x8F, 0x66, + 0x2F, 0xB2, 0x2F, 0x66, 0x98, 0x98, 0x2F, 0x51, + 0x89, 0xB2, 0x2F, 0xA3, 0xA3, 0xB2, 0xB2, 0xB2, + 0x2F, 0x2F, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0x66, + 0x8F, 0xA5, 0x8F, 0x20, 0x20, 0xA7, 0x20, 0xA6, + 0x6B, 0x6B, 0xE4, 0x48, 0x2C, 0xDB, 0x4F, 0x9E, + 0xD0, 0xD0, 0x8B, 0x82, 0x82, 0x82, 0x82, 0x82, + 0x59, 0x82, 0x82, 0x73, 0x7B, 0x68, 0x6B, 0x3D, + 0x68, 0x68, 0x84, 0x3D, 0x6B, 0x6B, 0xA0, 0x20, + 0x20, 0x20, 0x6D, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6D, 0x2F, 0xA0, 0xA5, 0x55, 0x98, 0x66, 0xA3, + 0xB2, 0x89, 0xB2, 0x98, 0x8F, 0x98, 0x2F, 0x51, + 0x74, 0xB2, 0xA3, 0xA3, 0x2F, 0x2F, 0xB2, 0x2F, + 0xA3, 0xA3, 0xA3, 0x66, 0x66, 0xA3, 0x2F, 0xA3, + 0x98, 0xA3, 0x6D, 0x20, 0x20, 0xCE, 0x20, 0x2A, + 0x6B, 0x6B, 0xEB, 0x2C, 0xE1, 0xF1, 0x7C, 0xD0, + 0x8B, 0x8B, 0x82, 0x82, 0x82, 0x82, 0x82, 0x59, + 0x82, 0x82, 0x42, 0x82, 0x31, 0x57, 0x4F, 0x7B, + 0x7B, 0xF5, 0xF6, 0xDB, 0x6B, 0x6B, 0x98, 0x20, + 0x20, 0x20, 0x2E, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x51, 0x66, 0xA0, 0xA0, 0x66, 0x2F, 0xB2, + 0xB2, 0x51, 0x2F, 0xA0, 0x55, 0xA3, 0x51, 0x89, + 0x44, 0xA3, 0x98, 0x98, 0x2F, 0x2F, 0x2F, 0xA3, + 0xA3, 0x66, 0x98, 0x98, 0x98, 0xA3, 0x2F, 0x2F, + 0x98, 0x8F, 0x20, 0x20, 0x3A, 0xA6, 0x20, 0xA0, + 0x6B, 0x6B, 0x6B, 0x6B, 0x7F, 0x7F, 0xC3, 0xC9, + 0xD0, 0xD0, 0x29, 0x59, 0x82, 0x73, 0x82, 0x73, + 0x59, 0x59, 0x59, 0x59, 0x59, 0x58, 0xAF, 0xF5, + 0x8A, 0x68, 0xEB, 0x6B, 0x6B, 0x6B, 0x98, 0x20, + 0x20, 0x20, 0x6D, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x51, 0x98, 0x55, 0xA0, 0xA3, 0xB2, 0x51, + 0x51, 0x2F, 0x98, 0x55, 0x8F, 0xB2, 0x89, 0x44, + 0xA3, 0x55, 0x55, 0x98, 0xA3, 0xB2, 0x2F, 0xA3, + 0x66, 0x66, 0x98, 0x8F, 0x66, 0xA3, 0x66, 0x98, + 0x55, 0x4C, 0x20, 0x20, 0xDA, 0xAD, 0x20, 0x98, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x3D, 0x9A, 0xD0, + 0xF2, 0x8B, 0x8B, 0x8B, 0x73, 0x82, 0x5B, 0x82, + 0x82, 0x59, 0x59, 0x73, 0x73, 0x58, 0x3D, 0x3D, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x66, 0x20, + 0x20, 0x3A, 0x3A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x2F, 0x55, 0xA5, 0x8F, 0xA3, 0x51, 0x51, + 0xB2, 0xA3, 0x66, 0x66, 0xA3, 0xB2, 0x89, 0x51, + 0x98, 0xA5, 0x55, 0x8F, 0x2F, 0xB2, 0xB2, 0xA3, + 0x66, 0x66, 0x98, 0x98, 0x98, 0x66, 0x66, 0x8F, + 0x8F, 0x92, 0x20, 0x20, 0x20, 0x6D, 0x6D, 0xA3, + 0x6B, 0x6B, 0xEB, 0x7F, 0x4F, 0xDB, 0xD2, 0xC9, + 0xC9, 0xD0, 0x8B, 0x8B, 0x73, 0x82, 0x59, 0x8B, + 0x59, 0x82, 0x59, 0x59, 0x73, 0xF5, 0xEB, 0x6B, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x55, 0x20, + 0x20, 0xA7, 0x54, 0xDA, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x98, 0xA0, 0x8F, 0xA3, 0xB2, 0x51, 0x51, + 0x51, 0x2F, 0xA3, 0xA3, 0xB2, 0xB2, 0x51, 0xB2, + 0xA0, 0xA5, 0x55, 0x66, 0x2F, 0x51, 0x2F, 0xA3, + 0x66, 0x66, 0x66, 0x98, 0x66, 0x66, 0x98, 0x98, + 0x98, 0x2A, 0x54, 0x95, 0x95, 0x71, 0x2E, 0x98, + 0x6B, 0x6B, 0x4D, 0x28, 0xDE, 0x88, 0xB7, 0x70, + 0xC9, 0xC9, 0xD0, 0xF2, 0x8B, 0x8B, 0x8B, 0x59, + 0x59, 0x59, 0x59, 0x5B, 0x59, 0xF3, 0x57, 0xE9, + 0xDB, 0x84, 0x6B, 0x6B, 0x6B, 0x6B, 0x4C, 0xDA, + 0x2E, 0xDA, 0x20, 0xDA, 0x2E, 0x2E, 0x6D, 0x20, + 0x4C, 0x98, 0x66, 0xA3, 0x2F, 0xB2, 0x51, 0x51, + 0xB2, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, + 0xA0, 0xA0, 0x8F, 0x2F, 0xB2, 0x89, 0xB2, 0xA3, + 0x66, 0x66, 0x98, 0x66, 0x66, 0x66, 0x66, 0xA3, + 0x2F, 0xD1, 0xE2, 0x52, 0x52, 0xF4, 0xBF, 0x9C, + 0x39, 0x6B, 0x6B, 0x6B, 0x7F, 0x4F, 0xE3, 0x6A, + 0xD0, 0xC9, 0xC9, 0xD0, 0xD0, 0x8B, 0x8B, 0x82, + 0x5B, 0x5B, 0x73, 0x8B, 0x59, 0x23, 0x6E, 0x31, + 0x59, 0x7B, 0xDB, 0x84, 0x68, 0x7F, 0xAE, 0x54, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x54, 0xA6, 0x3A, + 0xA0, 0xA3, 0xA3, 0x2F, 0x51, 0x51, 0x51, 0xB2, + 0x2F, 0xA3, 0x66, 0x66, 0xA3, 0xA3, 0xA3, 0xA3, + 0x8F, 0x8F, 0x66, 0x2F, 0x51, 0x51, 0xB2, 0xA3, + 0x66, 0x98, 0x98, 0x66, 0x66, 0xA3, 0x2F, 0x2F, + 0x3C, 0x88, 0x8D, 0x52, 0x52, 0x5D, 0xF7, 0xBF, + 0xCE, 0xA2, 0x6B, 0x6B, 0x6B, 0x6B, 0x7F, 0x85, + 0x70, 0xC9, 0xC9, 0xC9, 0xD0, 0xEA, 0x8B, 0x5B, + 0x82, 0xEA, 0x82, 0x82, 0x42, 0x57, 0x3D, 0x68, + 0x68, 0x57, 0x4A, 0x34, 0x22, 0xCC, 0x21, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0xDA, 0xA7, 0x6D, + 0xDF, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0x2F, 0x2F, + 0xA3, 0x66, 0x66, 0x66, 0xA3, 0xA3, 0x2F, 0x2F, + 0x66, 0x66, 0xA3, 0x2F, 0xB2, 0xB2, 0x2F, 0x66, + 0x8F, 0x8F, 0x8F, 0x98, 0xA3, 0xA3, 0x89, 0xD8, + 0x25, 0x5C, 0x3B, 0x5D, 0x52, 0x80, 0x70, 0x36, + 0x71, 0xA7, 0x44, 0x6B, 0x84, 0xCB, 0xAA, 0xF3, + 0xC9, 0xC9, 0xC9, 0xC9, 0xD0, 0x8B, 0x5B, 0x5B, + 0x5B, 0xEA, 0x82, 0x47, 0x7B, 0x68, 0x3D, 0x3D, + 0x6B, 0x3D, 0x6C, 0x2B, 0x80, 0x61, 0x96, 0x81, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3A, 0xDA, 0x63, + 0xAC, 0x6C, 0xB2, 0xB2, 0xB2, 0xB2, 0x2F, 0xA3, + 0xA3, 0x66, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, + 0x66, 0x98, 0x66, 0xA3, 0xB2, 0xB2, 0x2F, 0x66, + 0x8F, 0x8F, 0x2F, 0xD8, 0xE4, 0xCD, 0xAA, 0xB4, + 0x78, 0x2B, 0x3B, 0x70, 0x46, 0x5D, 0x5D, 0x52, + 0x9D, 0x81, 0x3A, 0xA3, 0xCD, 0x48, 0xBE, 0x4F, + 0xC3, 0xC9, 0xD0, 0xD0, 0xD0, 0xEA, 0x5B, 0x8B, + 0x5B, 0x82, 0x8B, 0x59, 0x4A, 0xF3, 0x33, 0x7F, + 0x3D, 0x6B, 0x4F, 0x6F, 0x5D, 0x52, 0x63, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x85, + 0x72, 0xDC, 0xD8, 0x2F, 0xA3, 0x2F, 0xA3, 0xA3, + 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, + 0xA3, 0x98, 0x66, 0x2F, 0xB2, 0x51, 0xA3, 0x98, + 0xA0, 0xA3, 0x93, 0xCF, 0x79, 0x27, 0x5C, 0x79, + 0x2B, 0x30, 0x80, 0x80, 0x5D, 0x5D, 0x5D, 0x5D, + 0x3F, 0x69, 0x20, 0x20, 0x2A, 0xD6, 0x3D, 0x6B, + 0x84, 0xE3, 0x34, 0xB7, 0xC9, 0xD0, 0xD0, 0xF2, + 0xD0, 0x8B, 0x31, 0x68, 0x68, 0x6E, 0x31, 0x33, + 0x7F, 0x7E, 0xA1, 0x6F, 0x52, 0x8D, 0xE5, 0xBF, + 0x20, 0x20, 0x20, 0x20, 0x81, 0xA8, 0x78, 0x52, + 0x52, 0xD2, 0xD8, 0xA3, 0xA3, 0x2F, 0x2F, 0xA3, + 0xA3, 0x66, 0x98, 0x98, 0x98, 0x98, 0x98, 0x66, + 0x51, 0x66, 0x2F, 0x51, 0x51, 0xB2, 0xA3, 0xA0, + 0xA0, 0x44, 0x78, 0xEF, 0x52, 0x30, 0x30, 0x30, + 0x3B, 0x70, 0x5D, 0x5D, 0x5D, 0x80, 0x5D, 0x5D, + 0x46, 0xC1, 0x71, 0x20, 0x81, 0xB1, 0xDD, 0x3D, + 0xA1, 0xE7, 0xDB, 0xCA, 0xD2, 0x6A, 0x6A, 0x6A, + 0xF3, 0xE9, 0xDB, 0x8A, 0x84, 0x3D, 0x84, 0xDC, + 0x25, 0x44, 0xB5, 0xEE, 0x30, 0xEF, 0xF0, 0x32, + 0x69, 0x5F, 0x4B, 0xA8, 0x99, 0x56, 0x67, 0x30, + 0x30, 0x34, 0xB2, 0x2F, 0xA3, 0xA3, 0x66, 0x66, + 0x98, 0x8F, 0x98, 0x98, 0x66, 0x66, 0x66, 0x66, + 0x51, 0x2F, 0xB2, 0x51, 0x51, 0x2F, 0x66, 0xA0, + 0x8F, 0xE0, 0xF9, 0x8D, 0x52, 0x5D, 0x46, 0x5D, + 0x80, 0x5D, 0x80, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, + 0x52, 0x52, 0x60, 0x81, 0x20, 0x20, 0x6D, 0xD1, + 0x48, 0xE7, 0x6B, 0x33, 0xF6, 0x7F, 0x7F, 0xDB, + 0x84, 0x6B, 0x6C, 0x6A, 0xF3, 0xEB, 0x6B, 0x3D, + 0x4F, 0xD8, 0xCD, 0x79, 0x30, 0x67, 0xF9, 0x24, + 0xED, 0xD9, 0x8C, 0xED, 0x37, 0x2B, 0x3B, 0x5D, + 0x80, 0x85, 0x4E, 0x98, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, + 0x51, 0x2F, 0xB2, 0xB2, 0xB2, 0xA3, 0x8F, 0x8F, + 0x98, 0xE0, 0xF0, 0x67, 0x5D, 0x80, 0x80, 0x5D, + 0x5D, 0x5D, 0x5D, 0x5D, 0x80, 0x5D, 0x5D, 0x5D, + 0x5D, 0x70, 0x27, 0x4B, 0x20, 0x81, 0x71, 0x3A, + 0xB5, 0xEB, 0x3D, 0xF1, 0xE1, 0x84, 0x84, 0xF1, + 0xE3, 0x3D, 0x6B, 0x6C, 0x34, 0xE7, 0x6B, 0x6B, + 0xD6, 0x74, 0x5E, 0x78, 0x67, 0x30, 0xEE, 0x5C, + 0xF9, 0xF9, 0x45, 0x5C, 0x2B, 0x3B, 0x5D, 0x5D, + 0x5D, 0x5D, 0xF8, 0x44, 0x66, 0x66, 0x66, 0x66, + 0x2F, 0x2F, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, + 0xB2, 0x2F, 0xA3, 0xA3, 0xA3, 0x98, 0x8F, 0x98, + 0x66, 0x83, 0x76, 0x67, 0x30, 0x80, 0x5D, 0x80, + 0x5D, 0x5D, 0x80, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, + 0x80, 0x5D, 0x22, 0xFA, 0x20, 0x81, 0x20, 0x20, + 0xA5, 0x6B, 0x6B, 0xE8, 0xBE, 0x3D, 0x6B, 0x2C, + 0xE1, 0xEB, 0x6B, 0x3D, 0x3E, 0xA1, 0x6B, 0x6B, + 0x4D, 0x74, 0xE8, 0x62, 0x67, 0x30, 0x8D, 0x67, + 0xEE, 0xEE, 0xEE, 0x67, 0x30, 0x80, 0x5D, 0x5D, + 0x52, 0x5D, 0x85, 0xAC, 0x3E, 0xA3, 0x66, 0x66, + 0x2F, 0x51, 0x51, 0x51, 0x51, 0xB2, 0x2F, 0x2F, + 0x2F, 0xA3, 0xA3, 0x66, 0x98, 0x8F, 0x8F, 0x66, + 0x2F, 0x83, 0xBC, 0xEE, 0x5D, 0x5D, 0x5D, 0x5D, + 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x80, 0x5D, 0x5D, + 0x5D, 0x5D, 0x22, 0xB0, 0xAE, 0x81, 0x20, 0x20, + 0x4C, 0x3D, 0xEB, 0x39, 0x57, 0x6B, 0x6B, 0x3E, + 0x97, 0x3D, 0x6B, 0x3D, 0x6B, 0x6B, 0x6B, 0x6B, + 0x3D, 0x3C, 0xBA, 0x62, 0xEE, 0x5D, 0x5D, 0x30, + 0x30, 0x8D, 0x8D, 0x30, 0x52, 0x5D, 0x5D, 0x80, + 0x5D, 0x5D, 0x5D, 0x85, 0xB0, 0x6E, 0x2F, 0x66, + 0x2F, 0xB2, 0x51, 0xB2, 0x2F, 0x2F, 0xA3, 0xA3, + 0xB2, 0xA3, 0x66, 0x98, 0x98, 0x8F, 0x98, 0xA3, + 0x2F, 0x51, 0xDE, 0x8E, 0x30, 0x5D, 0x5D, 0x5D, + 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, + 0x52, 0x80, 0x5D, 0x22, 0x43, 0x4B, 0x20, 0x6D, + 0x44, 0x6B, 0x6B, 0x3D, 0x6B, 0x6B, 0x6B, 0x4D, + 0x3D, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x3D, 0x6B, + 0x4D, 0x2A, 0xAE, 0x76, 0xEE, 0x30, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x5D, 0x5D, 0x5D, 0x80, + 0x5D, 0x5D, 0x80, 0x80, 0x5D, 0x7A, 0xB6, 0x51, + 0xB2, 0xB2, 0xB2, 0xA3, 0x66, 0x66, 0x66, 0xA3, + 0x2F, 0x66, 0x98, 0x8F, 0xA0, 0x98, 0xA3, 0x2F, + 0x2F, 0x51, 0xAB, 0x8E, 0x5D, 0x5D, 0x5D, 0x5D, + 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x80, + 0x5D, 0x80, 0x5D, 0x52, 0x52, 0x94, 0x2F, 0x7E, + 0x6B, 0x3D, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x7E, + 0xAD, 0x54, 0xAE, 0x24, 0x2B, 0x3B, 0x5D, 0x52, + 0x5D, 0x5D, 0x5D, 0x5D, 0x80, 0x5D, 0x5D, 0x80, + 0x5D, 0x52, 0x52, 0x5D, 0x5D, 0x5D, 0xD2, 0x3E, + 0x89, 0x89, 0xB2, 0xA3, 0x66, 0x98, 0x66, 0x66, + 0x2F, 0x66, 0x8F, 0x8F, 0xA0, 0x98, 0xA3, 0xB2, + 0x2F, 0x51, 0xDE, 0x79, 0x5D, 0x80, 0x5D, 0x5D, + 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, + 0x5D, 0x5D, 0x80, 0x5D, 0x52, 0x6F, 0xA4, 0x6B, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x4D, 0xA2, 0xCE, + 0x20, 0x20, 0x95, 0x24, 0x67, 0x3B, 0x80, 0x80, + 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, + 0x80, 0x5D, 0x5D, 0x5D, 0x5D, 0x30, 0xB0, 0x86, + 0x89, 0x51, 0x2F, 0x66, 0x98, 0x98, 0xA3, 0xA3, + 0xA3, 0x66, 0x8F, 0xA0, 0x8F, 0x66, 0x2F, 0xB2, + 0x2F, 0x4E, 0x76, 0x2B, 0x30, 0x5D, 0x5D, 0x5D, + 0x80, 0x80, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, + 0x80, 0x5D, 0x5D, 0x5D, 0x46, 0x52, 0x21, 0x74, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, + 0x6B, 0x6B, 0x6B, 0x6B, 0x7E, 0x98, 0x3A, 0x20, + 0x20, 0x81, 0x60, 0xED, 0x2B, 0x52, 0x5D, 0x5D, + 0x80, 0x5D, 0x5D, 0x80, 0x5D, 0x5D, 0x5D, 0x80, + 0x22, 0x5D, 0x5D, 0x5D, 0x8D, 0x2B, 0x38, 0x39, + 0x51, 0x66, 0x8F, 0xA0, 0xA0, 0x8F, 0x98, 0x66, + 0x66, 0x66, 0x8F, 0x55, 0x8F, 0xA3, 0xB2, 0xB2, + 0xA3, 0xE8, 0xF9, 0x30, 0x3B, 0x80, 0x5D, 0x5D, + 0x5D, 0x80, 0x80, 0x5D, 0x5D, 0x5D, 0x80, 0x5D, + 0x5D, 0x5D, 0x5D, 0x5D, 0x52, 0x30, 0xD4, 0x99, + 0x51, 0x4D, 0x6B, 0x6B, 0x6B, 0x6B, 0x4D, 0x6B, + 0x6B, 0x6B, 0x7E, 0xA3, 0x2E, 0x20, 0x20, 0x20, + 0x20, 0x81, 0xC5, 0xED, 0x2B, 0x3B, 0x5D, 0x5D, + 0x5D, 0x5D, 0x5D, 0x5D, 0x80, 0x5D, 0x5D, 0x80, + 0x5D, 0x52, 0x52, 0x6F, 0xDE, 0x2C, 0x39, 0x51, + 0x66, 0xA0, 0xA5, 0xA5, 0x55, 0x8F, 0x66, 0x66, + 0xA0, 0xA0, 0xA0, 0xA0, 0x8F, 0xA3, 0x2F, 0x2F, + 0x51, 0xD5, 0x45, 0x8D, 0x3B, 0x5D, 0x80, 0x5D, + 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, + 0x80, 0x5D, 0x5D, 0x5D, 0x52, 0x67, 0x37, 0xA9, + 0x3A, 0xCE, 0xA0, 0x2F, 0x51, 0x51, 0xB2, 0xA3, + 0xA5, 0x9C, 0x54, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x54, 0x99, 0xED, 0x67, 0x30, 0x5D, 0x5D, + 0x5D, 0x80, 0x5D, 0x5D, 0x5D, 0x5D, 0x3B, 0x80, + 0x8D, 0x79, 0x48, 0x2C, 0x39, 0x44, 0xB2, 0x66, + 0xA0, 0x2A, 0xA5, 0xA0, 0x8F, 0x66, 0xA3, 0xA3, + 0xA0, 0x8F, 0x8F, 0xA0, 0x8F, 0xA3, 0xB2, 0xB2, + 0xD8, 0xBC, 0x45, 0xEE, 0x67, 0x8D, 0x30, 0x30, + 0x52, 0x52, 0x80, 0x5D, 0x5D, 0x5D, 0x5D, 0x80, + 0x5D, 0x5D, 0x5D, 0x80, 0x3B, 0x67, 0xF9, 0x32, + 0x69, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0xBF, 0xEC, 0xED, 0x2B, 0x30, 0x5D, 0x5D, + 0x80, 0x5D, 0x5D, 0x5D, 0x52, 0x30, 0x67, 0x2B, + 0xCF, 0xAA, 0xD8, 0x89, 0x89, 0x51, 0x66, 0x55, + 0x2A, 0x2A, 0xA5, 0x8F, 0x66, 0xA3, 0x2F, 0x2F, + 0xA3, 0xA3, 0x66, 0x98, 0x98, 0x2F, 0xB2, 0x2F, + 0xD1, 0x28, 0x56, 0xED, 0x62, 0x37, 0x5C, 0x79, + 0x8E, 0x2B, 0x2B, 0x30, 0x30, 0x30, 0x5D, 0x5D, + 0x5D, 0x5D, 0x5D, 0x80, 0x3B, 0xEE, 0x56, 0xA9, + 0x75, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5F, 0x99, 0xD9, 0x45, 0x8D, 0x3B, 0x5D, + 0x5D, 0x3B, 0x5D, 0x8D, 0x2B, 0x79, 0x79, 0x41, + 0x83, 0xB2, 0xB2, 0x89, 0x89, 0x2F, 0xA0, 0x2A, + 0xAD, 0xA5, 0x98, 0x66, 0xA3, 0xB2, 0x2F, 0xB2, + 0xD8, 0xB2, 0xA3, 0x98, 0x98, 0x2F, 0x51, 0xB2, + 0xA3, 0x83, 0x3E, 0x25, 0xD5, 0xE5, 0x50, 0x8C, + 0xED, 0x24, 0x24, 0xF0, 0x45, 0x8E, 0x2B, 0x30, + 0x30, 0x5D, 0x3B, 0x30, 0xEE, 0xF0, 0xC6, 0x65, + 0x75, 0x71, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x4B, 0xC5, 0x7D, 0x24, 0xEE, 0x67, 0x30, + 0x30, 0x8D, 0x67, 0x8E, 0xF9, 0xF7, 0x97, 0xDD, + 0x2F, 0x2F, 0x51, 0x89, 0x89, 0x2F, 0x55, 0x2A, + 0xA5, 0x8F, 0x66, 0xA3, 0x2F, 0xB2, 0xB2, 0xB2, + 0xDD, 0xA3, 0x66, 0x98, 0x66, 0x2F, 0xB2, 0xB2, + 0xA3, 0xA3, 0xB2, 0x51, 0x89, 0x44, 0xE0, 0x5E, + 0x91, 0x9F, 0x9F, 0x7D, 0x7D, 0xD9, 0x24, 0xF0, + 0x79, 0x8E, 0xEE, 0x8E, 0x24, 0x40, 0x65, 0x35, + 0x69, 0x2E, 0x98, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, + 0x2F, 0xB2, 0xB2, 0xB2, 0x2F, 0x2F, 0x2F, 0x98, + 0xA5, 0xA7, 0x95, 0xD7, 0x8C, 0xF0, 0x8E, 0x8E, + 0xEE, 0x79, 0xF0, 0xED, 0x50, 0xE8, 0x89, 0x2F, + 0xA3, 0xA3, 0xB2, 0x89, 0xB2, 0x66, 0xA0, 0x55, + 0x8F, 0x98, 0x66, 0xA3, 0xB2, 0x51, 0x51, 0xB2, + 0x74, 0xA0, 0xA0, 0x98, 0x66, 0xB2, 0xB2, 0xB2, + 0xA3, 0xA3, 0x2F, 0xB2, 0xB2, 0xB2, 0xA3, 0x2F, + 0x51, 0x83, 0xE4, 0x87, 0xB8, 0xFA, 0xA9, 0xC6, + 0x40, 0x64, 0x64, 0x50, 0xD7, 0x65, 0x35, 0x60, + 0x98, 0xB2, 0x66, 0x66, 0xA3, 0x2F, 0xA3, 0xA3, + 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, 0xA3, 0x2F, 0xB2, + 0x89, 0xDD, 0x9B, 0xC0, 0x7D, 0x50, 0x8C, 0xED, + 0xED, 0x8C, 0x40, 0x9F, 0x4E, 0x51, 0xB2, 0x2F, + 0x2F, 0x2F, 0xB2, 0x51, 0xA3, 0x98, 0xA0, 0x55, + 0xA0, 0xA0, 0x8F, 0x66, 0x2F, 0x51, 0xB2, 0xA3, + 0xA3, 0x2A, 0x55, 0x98, 0xA3, 0x2F, 0xB2, 0x2F, + 0x66, 0x66, 0x2F, 0xB2, 0xD1, 0x2F, 0x2F, 0xA3, + 0xB2, 0xB2, 0xA3, 0x8F, 0xA3, 0x2F, 0xD1, 0x94, + 0xEC, 0x65, 0x65, 0xC0, 0xC0, 0x35, 0x95, 0xC2, + 0xA3, 0x98, 0x66, 0xA3, 0x2F, 0x2F, 0x2F, 0xA3, + 0xA3, 0x2F, 0xB2, 0x2F, 0x2F, 0x2F, 0x2F, 0x51, + 0x89, 0x44, 0xD1, 0x60, 0x35, 0xA9, 0x32, 0xC6, + 0xD7, 0x32, 0x94, 0x44, 0x2F, 0xB2, 0xB2, 0xB2, + 0xA3, 0x2F, 0xB2, 0x2F, 0xA3, 0x8F, 0xA0, 0xA0, + 0x55, 0xA0, 0x8F, 0xA3, 0x51, 0x51, 0x2F, 0xA3, + 0x8F, 0x2A, 0x55, 0x66, 0xA3, 0x2F, 0x2F, 0xB2, + 0xA3, 0x66, 0x2F, 0xB2, 0x51, 0xB2, 0x2F, 0x66, + 0xA3, 0xA3, 0x66, 0x8F, 0x8F, 0x8F, 0xA0, 0x2F, + 0x5E, 0xDF, 0xB9, 0x60, 0x95, 0xD3, 0x89, 0x2F, + 0xA3, 0x66, 0xA3, 0x2F, 0xB2, 0x2F, 0xA3, 0xA3, + 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0xB2, + 0x51, 0x2F, 0x8F, 0x2F, 0xC4, 0xB9, 0x9B, 0xEC, + 0x53, 0xB3, 0x4E, 0xA3, 0x2F, 0xB2, 0xB2, 0xB2, + 0xA3, 0x66, 0xA3, 0xA3, 0x66, 0x8F, 0x8F, 0x8F, + 0x8F, 0x8F, 0xA3, 0x51, 0x89, 0x51, 0xA3, 0x66, + 0xA0, 0x55, 0x8F, 0xA3, 0x2F, 0x2F, 0x2F, 0xB2, + 0x2F, 0xA3, 0x2F, 0x51, 0x51, 0xB2, 0xA3, 0x66, + 0x66, 0xA3, 0x66, 0x66, 0x66, 0x66, 0x66, 0xA3, + 0xB2, 0xC2, 0x74, 0xD8, 0xB2, 0xA3, 0xA3, 0xA3, + 0x66, 0x66, 0x2F, 0x2F, 0xA3, 0x66, 0x66, 0x66, + 0xA3, 0xA3, 0xB2, 0xB2, 0xB2, 0xB2, 0x2F, 0xB2, + 0x2F, 0x66, 0xA0, 0x55, 0x98, 0x2F, 0x89, 0x89, + 0x89, 0xB2, 0x2F, 0xA3, 0x2F, 0x51, 0x51, 0xB2, + 0x2F, 0x66, 0xA3, 0xA3, 0x66, 0x66, 0x66, 0x66, + 0x66, 0xA3, 0xB2, 0x89, 0xD8, 0x51, 0xA3, 0x98, + 0x66, 0x98, 0x66, 0x2F, 0x2F, 0x2F, 0x2F, 0xB2, + 0xB2, 0xA3, 0xA3, 0xB2, 0xB2, 0xB2, 0x2F, 0xA3, + 0x66, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0xB2, + 0x89, 0xD8, 0x89, 0x2F, 0x66, 0x66, 0xA3, 0xA3, + 0x98, 0x98, 0x66, 0x66, 0x98, 0x98, 0x66, 0xA3, + 0x2F, 0xA3, 0xB2, 0xB2, 0xB2, 0xB2, 0x2F, 0x2F, + 0xB2, 0x2F, 0x66, 0x98, 0x66, 0xA3, 0x2F, 0x2F, + 0x2F, 0xB2, 0x2F, 0xA3, 0xA3, 0xB2, 0xB2, 0x2F, + 0x2F, 0x66, 0x66, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, + 0x2F, 0xB2, 0x89, 0xD8, 0x44, 0x2F, 0x66, 0x66, + 0xA3, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, + 0x2F, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0xA3, + 0x66, 0xA3, 0x2F, 0xB2, 0xB2, 0xB2, 0x51, 0x51, + 0x89, 0x89, 0xB2, 0xA3, 0x98, 0x66, 0xA3, 0x66, + 0x98, 0x98, 0x98, 0x98, 0x98, 0x66, 0xA3, 0x2F, + 0xA3, 0x2F, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, + 0xB2, 0x2F, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, + 0x2F, 0xB2, 0xB2, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, + 0x2F, 0xA3, 0x66, 0xA3, 0x2F, 0xB2, 0xB2, 0xB2, + 0x51, 0x51, 0x89, 0x89, 0xB2, 0xA3, 0x98, 0x66 }; unsigned char linux_logo_bw[] __initdata = { @@ -939,63 +941,63 @@ unsigned char linux_logo_bw[] __initdata = { 0xF9, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xCF, 0xC3, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x87, 0x81, 0xF9, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xA7, - 0x99, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF9, 0xF3, 0xBC, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xF9, 0xE3, 0xBC, 0xF9, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xB0, 0x3C, 0xF9, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xB0, - 0x19, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF9, 0xC0, 0x03, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xF9, 0x80, 0x01, 0xF8, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x80, 0x01, 0xF8, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x80, - 0x01, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xF9, 0xC0, 0x21, 0xD8, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xF9, 0xB1, 0x80, 0xEC, 0xC0, 0x1F, - 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x90, 0x00, 0xE4, - 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x8C, - 0xC0, 0x7C, 0x04, 0x81, 0xFF, 0xFF, 0xFF, 0xFF, - 0xE3, 0x80, 0x00, 0x7C, 0x40, 0x11, 0xFF, 0xFF, - 0xFF, 0xFF, 0xE3, 0x80, 0x00, 0x7F, 0xD2, 0x29, - 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0x00, 0x00, 0x3F, - 0x80, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0x00, - 0x00, 0x3F, 0x80, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, - 0x1E, 0x00, 0x00, 0x1F, 0x80, 0x19, 0xFF, 0xFF, - 0xFF, 0xFE, 0x1C, 0x00, 0x00, 0x1E, 0x80, 0x19, - 0xFF, 0xFF, 0xFF, 0xFE, 0x3C, 0x00, 0x00, 0x1E, - 0x80, 0x11, 0xFF, 0xFF, 0xFF, 0xFC, 0x7C, 0x00, - 0x00, 0x0F, 0x80, 0x11, 0xFF, 0xFF, 0xFF, 0xFC, - 0xF8, 0x00, 0x00, 0x0E, 0x80, 0x11, 0xFF, 0xFF, - 0xFF, 0xFC, 0xF8, 0x00, 0x00, 0x06, 0x00, 0x11, - 0xFF, 0xFF, 0xFF, 0xF8, 0xF8, 0x00, 0x00, 0x06, - 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF9, 0xF0, 0x00, - 0x00, 0x02, 0x00, 0x09, 0xFF, 0xFF, 0xFF, 0xF1, - 0xF0, 0x00, 0x00, 0x02, 0x80, 0x10, 0xFF, 0xFF, - 0xFF, 0xF1, 0xE0, 0x00, 0x00, 0x00, 0x97, 0x10, + 0xF8, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xA7, + 0x99, 0xF9, 0xC2, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF9, 0xF3, 0xBC, 0xF9, 0x90, 0x00, 0x1F, 0xFF, + 0xFF, 0xFF, 0xF9, 0xE3, 0xBC, 0xF9, 0xA0, 0x00, + 0x8F, 0xFF, 0xFF, 0xFF, 0xF9, 0xB0, 0x3C, 0xF9, + 0x83, 0xE0, 0x2F, 0xFF, 0xFF, 0xFF, 0xF9, 0xB0, + 0x19, 0xF0, 0x1F, 0xFE, 0x0F, 0xFF, 0xFF, 0xFF, + 0xF9, 0xC0, 0x03, 0xF0, 0x3F, 0xF7, 0x8F, 0xFF, + 0xFF, 0xFF, 0xF9, 0x80, 0x01, 0xF8, 0x7F, 0xF7, + 0xC7, 0xFF, 0xFF, 0xFF, 0xF9, 0x80, 0x01, 0xF8, + 0x6F, 0xF7, 0xE7, 0xFF, 0xFF, 0xFF, 0xF9, 0x80, + 0x01, 0xF8, 0x7F, 0xF7, 0xE7, 0xFF, 0xFF, 0xFF, + 0xF9, 0xC0, 0x21, 0xD8, 0x7F, 0xE7, 0xEF, 0xFF, + 0xFF, 0xFF, 0xF9, 0xB1, 0x80, 0xEC, 0x7B, 0xFF, + 0xEF, 0xFF, 0xFF, 0xFF, 0xF1, 0x90, 0x00, 0xE4, + 0x7B, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xF1, 0x8C, + 0xC0, 0x7C, 0x79, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, + 0xE3, 0x80, 0x00, 0x7C, 0x7C, 0xFF, 0xCF, 0xFF, + 0xFF, 0xFF, 0xE3, 0x80, 0x00, 0x7F, 0x77, 0xFF, + 0xDF, 0xFF, 0xFF, 0xFF, 0x87, 0x00, 0x00, 0x3F, + 0x3F, 0xFF, 0xDF, 0xFF, 0xFF, 0xFF, 0x0E, 0x00, + 0x00, 0x3F, 0xBF, 0xFF, 0x9F, 0xFF, 0xFF, 0xFF, + 0x1E, 0x00, 0x00, 0x1F, 0x9F, 0xFF, 0x3F, 0xFF, + 0xFF, 0xFE, 0x1C, 0x00, 0x00, 0x1F, 0x9F, 0xFF, + 0x7F, 0xFF, 0xFF, 0xFE, 0x3C, 0x00, 0x00, 0x1F, + 0x8F, 0xFE, 0x7F, 0xFF, 0xFF, 0xFC, 0x7C, 0x00, + 0x00, 0x0F, 0xC7, 0xFC, 0xFF, 0xFF, 0xFF, 0xFC, + 0xF8, 0x00, 0x00, 0x0F, 0xF7, 0xF9, 0xFF, 0xFF, + 0xFF, 0xFC, 0xF8, 0x00, 0x00, 0x07, 0xFB, 0xF3, + 0xFF, 0xFF, 0xFF, 0xF8, 0xF8, 0x00, 0x00, 0x07, + 0xFD, 0xE7, 0xFF, 0xFF, 0xFF, 0xF9, 0xF0, 0x00, + 0x00, 0x03, 0xFE, 0x8F, 0xFF, 0xFF, 0xFF, 0xF1, + 0xF0, 0x00, 0x00, 0x03, 0xFE, 0x1F, 0xFF, 0xFF, + 0xFF, 0xF1, 0xE0, 0x00, 0x00, 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x00, 0x00, - 0xDF, 0xF0, 0xFF, 0xFF, 0xFF, 0xE3, 0xC0, 0x00, - 0x00, 0x00, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xC7, - 0xC0, 0x00, 0x00, 0x01, 0xFF, 0xF8, 0xFF, 0xFF, - 0xFF, 0xC7, 0x80, 0x00, 0x00, 0x01, 0xFF, 0xF8, + 0xFE, 0xBF, 0xFF, 0xFF, 0xFF, 0xE3, 0xC0, 0x00, + 0x00, 0x00, 0xFE, 0x3F, 0xFF, 0xFF, 0xFF, 0xC7, + 0xC0, 0x00, 0x00, 0x01, 0xFE, 0xBF, 0xFF, 0xFF, + 0xFF, 0xC7, 0x80, 0x00, 0x00, 0x01, 0xFE, 0x9F, 0xFF, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x00, 0x01, - 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0x8F, 0x80, 0x00, - 0x00, 0x01, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0x9F, - 0x80, 0x00, 0x00, 0x01, 0xFF, 0xF8, 0xFF, 0xFF, - 0xFF, 0x9F, 0x80, 0x00, 0x00, 0x01, 0x80, 0x18, + 0xFE, 0x07, 0xFF, 0xFF, 0xFF, 0x8F, 0x80, 0x00, + 0x00, 0x01, 0xFE, 0x87, 0xFF, 0xFF, 0xFF, 0x9F, + 0x80, 0x00, 0x00, 0x01, 0xFD, 0x33, 0xFF, 0xFF, + 0xFF, 0x9F, 0x80, 0x00, 0x00, 0x01, 0x80, 0xF3, 0xFF, 0xFF, 0xFF, 0x9E, 0x80, 0x00, 0x00, 0x03, - 0xA8, 0x11, 0xFF, 0xFF, 0xFF, 0x9F, 0x80, 0x00, - 0x00, 0x02, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0x99, - 0x80, 0x00, 0x00, 0x00, 0x00, 0x09, 0xFF, 0xFF, - 0xFF, 0x00, 0x80, 0x00, 0x00, 0x01, 0xC0, 0x01, + 0x8B, 0xF9, 0xFF, 0xFF, 0xFF, 0x9F, 0x80, 0x00, + 0x00, 0x02, 0x27, 0xF8, 0xFF, 0xFF, 0xFF, 0x99, + 0x80, 0x00, 0x00, 0x00, 0x07, 0xF8, 0xFF, 0xFF, + 0xFF, 0x00, 0x80, 0x00, 0x00, 0x01, 0x8F, 0xF8, 0xFF, 0xFF, 0xFE, 0x20, 0x60, 0x00, 0x00, 0x00, - 0xFF, 0xC3, 0xFF, 0xFF, 0xF8, 0x00, 0x30, 0x00, - 0x00, 0x00, 0xFF, 0x0F, 0xFF, 0xFF, 0xC0, 0x40, - 0x38, 0x00, 0x00, 0x00, 0xFE, 0x47, 0xFF, 0xFF, - 0x81, 0x00, 0x1C, 0x00, 0x00, 0x00, 0xFC, 0x23, - 0xFF, 0xFF, 0x90, 0x00, 0x1E, 0x00, 0x00, 0x00, - 0x78, 0x11, 0xFF, 0xFF, 0x80, 0x00, 0x0F, 0x80, - 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0x80, 0x00, + 0xE3, 0xF8, 0xFF, 0xFF, 0xF8, 0x00, 0x30, 0x00, + 0x00, 0x00, 0xF8, 0x78, 0xFF, 0xFF, 0xC0, 0x40, + 0x38, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x7F, 0xFF, + 0x81, 0x00, 0x1C, 0x00, 0x00, 0x00, 0xFC, 0x20, + 0x7F, 0xFF, 0x90, 0x00, 0x1E, 0x00, 0x00, 0x00, + 0x78, 0x10, 0xFF, 0xFF, 0x80, 0x00, 0x0F, 0x80, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x80, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, 0xC0, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x04, 0x7F, 0xFF, 0x80, 0x00, 0x03, 0xC0, 0x00, 0x10, @@ -1024,22 +1026,22 @@ unsigned char linux_logo_bw[] __initdata = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, }; -/* Painted by Johnny Stenback <jst@uwasa.fi> */ +unsigned char linux_logo16_red[0]; +unsigned char linux_logo16_green[0]; +unsigned char linux_logo16_blue[0]; +unsigned char linux_logo16[0]; + +#else + +/* prototypes only */ +extern unsigned char linux_logo_red[]; +extern unsigned char linux_logo_green[]; +extern unsigned char linux_logo_blue[]; +extern unsigned char linux_logo[]; +extern unsigned char linux_logo_bw[]; +extern unsigned char linux_logo16_red[]; +extern unsigned char linux_logo16_green[]; +extern unsigned char linux_logo16_blue[]; +extern unsigned char linux_logo16[]; -unsigned char *linux_serial_image __initdata = "\n" -" .u$e.\n" -" .$$$$$:S\n" -" $\"*$/\"*$$\n" -" $.`$ . ^F\n" -" 4k+#+T.$F\n" -" 4P+++\"$\"$\n" -" :R\"+ t$$B\n" -" ___# $$$\n" -" | | R$$k\n" -" dd. | Linux $!$\n" -" ddd | Sparc $9$F\n" -" '!!!!!$ !!#!`\n" -" !!!!!* .!!!!!`\n" -"'!!!!!!!W..e$$!!!!!!` %s\n" -" \"~^^~ ^~~^\n" -"\n"; +#endif diff --git a/include/asm-sparc/mostek.h b/include/asm-sparc/mostek.h index 12baee12a..407869348 100644 --- a/include/asm-sparc/mostek.h +++ b/include/asm-sparc/mostek.h @@ -1,13 +1,15 @@ -/* $Id: mostek.h,v 1.8 1996/11/04 00:45:30 ecd Exp $ +/* $Id: mostek.h,v 1.9 1998/07/28 16:53:25 jj Exp $ * mostek.h: Describes the various Mostek time of day clock registers. * * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) * Copyright (C) 1996 Thomas K. Dyas (tdyas@eden.rutgers.edu) + * Added intersil code 05/25/98 Chris Davis (cdavis@cois.on.ca) */ #ifndef _SPARC_MOSTEK_H #define _SPARC_MOSTEK_H +#include <linux/config.h> #include <asm/idprom.h> /* M48T02 Register Map (adapted from Sun NVRAM/Hostid FAQ) @@ -114,7 +116,46 @@ struct mostek48t08 { }; extern struct mostek48t08 *mstk48t08_regs; -enum sparc_clock_type { MSTK48T02, MSTK48T08, MSTK_INVALID }; extern enum sparc_clock_type sp_clock_typ; +#ifdef CONFIG_SUN4 +enum sparc_clock_type { MSTK48T02, MSTK48T08, \ +INTERSIL, MSTK_INVALID }; +#else +enum sparc_clock_type { MSTK48T02, MSTK48T08, \ +MSTK_INVALID }; +#endif + +#ifdef CONFIG_SUN4 +/* intersil on a sun 4/260 code data from harris doc */ +struct intersil_dt { + volatile unsigned char int_csec; + volatile unsigned char int_hour; + volatile unsigned char int_min; + volatile unsigned char int_sec; + volatile unsigned char int_month; + volatile unsigned char int_day; + volatile unsigned char int_year; + volatile unsigned char int_dow; +}; + +struct intersil { + struct intersil_dt clk; + struct intersil_dt cmp; + volatile unsigned char int_intr_reg; + volatile unsigned char int_cmd_reg; +}; + +#define INTERSIL_STOP 0x0 +#define INTERSIL_START 0x8 +#define INTERSIL_INTR_DISABLE 0x0 +#define INTERSIL_INTR_ENABLE 0x10 +#define INTERSIL_32K 0x0 +#define INTERSIL_NORMAL 0x0 +#define INTERSIL_24H 0x4 +#define INTERSIL_INT_100HZ 0x2 + +/* end of intersil info */ +#endif + #endif /* !(_SPARC_MOSTEK_H) */ diff --git a/include/asm-sparc/page.h b/include/asm-sparc/page.h index 922f5e5e9..57e46e7b0 100644 --- a/include/asm-sparc/page.h +++ b/include/asm-sparc/page.h @@ -1,4 +1,4 @@ -/* $Id: page.h,v 1.40 1998/02/06 14:14:46 jj Exp $ +/* $Id: page.h,v 1.43 1998/05/11 08:40:11 davem Exp $ * page.h: Various defines and such for MMU operations on the Sparc for * the Linux kernel. * diff --git a/include/asm-sparc/pgtable.h b/include/asm-sparc/pgtable.h index 11f37e980..2de010213 100644 --- a/include/asm-sparc/pgtable.h +++ b/include/asm-sparc/pgtable.h @@ -1,4 +1,4 @@ -/* $Id: pgtable.h,v 1.74 1998/03/11 04:08:37 tdyas Exp $ */ +/* $Id: pgtable.h,v 1.77 1998/08/04 20:51:19 davem Exp $ */ #ifndef _SPARC_PGTABLE_H #define _SPARC_PGTABLE_H @@ -91,6 +91,7 @@ BTFIXUPDEF_SIMM13(user_ptrs_per_pgd) #define VMALLOC_VMADDR(x) ((unsigned long)(x)) /* This is the same accross all platforms */ #define VMALLOC_START (0xfe300000) +#define VMALLOC_END ~0x0UL BTFIXUPDEF_INT(page_none) BTFIXUPDEF_INT(page_shared) @@ -354,6 +355,7 @@ BTFIXUPDEF_CALL(pte_t *, get_pte_fast, void) BTFIXUPDEF_CALL(pgd_t *, get_pgd_fast, void) BTFIXUPDEF_CALL(void, free_pte_slow, pte_t *) BTFIXUPDEF_CALL(void, free_pgd_slow, pgd_t *) +BTFIXUPDEF_CALL(int, do_check_pgt_cache, int, int) #define get_pte_fast() BTFIXUP_CALL(get_pte_fast)() extern __inline__ pmd_t *get_pmd_fast(void) @@ -366,6 +368,7 @@ extern __inline__ void free_pmd_slow(pmd_t *pmd) { } #define free_pgd_slow(pgd) BTFIXUP_CALL(free_pgd_slow)(pgd) +#define do_check_pgt_cache(low,high) BTFIXUP_CALL(do_check_pgt_cache)(low,high) /* * Allocate and free page tables. The xxx_kernel() versions are @@ -571,7 +574,6 @@ __get_iospace (unsigned long addr) #define module_map vmalloc #define module_unmap vfree -#define module_shrink vshrink /* Needs to be defined here and not in linux/mm.h, as it is arch dependent */ #define PageSkip(page) (test_bit(PG_skip, &(page)->flags)) diff --git a/include/asm-sparc/pgtsrmmu.h b/include/asm-sparc/pgtsrmmu.h index fac1df5ed..fc569dcaf 100644 --- a/include/asm-sparc/pgtsrmmu.h +++ b/include/asm-sparc/pgtsrmmu.h @@ -1,4 +1,4 @@ -/* $Id: pgtsrmmu.h,v 1.28 1997/03/15 07:47:52 davem Exp $ +/* $Id: pgtsrmmu.h,v 1.29 1998/07/26 03:05:42 davem Exp $ * pgtsrmmu.h: SRMMU page table defines and code. * * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) @@ -30,6 +30,7 @@ #define SRMMU_PGD_TABLE_SIZE 0x400 /* 256 entries, 4 bytes a piece */ #define SRMMU_VMALLOC_START (0xfe300000) +#define SRMMU_VMALLOC_END ~0x0UL /* Definition of the values in the ET field of PTD's and PTE's */ #define SRMMU_ET_MASK 0x3 diff --git a/include/asm-sparc/pgtsun4.h b/include/asm-sparc/pgtsun4.h index 170465d98..d9d8afaa2 100644 --- a/include/asm-sparc/pgtsun4.h +++ b/include/asm-sparc/pgtsun4.h @@ -1,4 +1,4 @@ -/* $Id: pgtsun4.h,v 1.3 1998/01/30 11:00:01 jj Exp $ +/* $Id: pgtsun4.h,v 1.4 1998/07/26 03:05:42 davem Exp $ * pgtsun4.h: Sun4 specific pgtable.h defines and code. * * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) @@ -48,6 +48,7 @@ * area, makes sense. This works out to the value below. */ #define SUN4C_VMALLOC_START (0xfe300000) +#define SUN4C_VMALLOC_END ~0x0UL /* * Sparc SUN4C pte fields. diff --git a/include/asm-sparc/pgtsun4c.h b/include/asm-sparc/pgtsun4c.h index d23881bfb..197f4afca 100644 --- a/include/asm-sparc/pgtsun4c.h +++ b/include/asm-sparc/pgtsun4c.h @@ -1,4 +1,4 @@ -/* $Id: pgtsun4c.h,v 1.35 1998/01/30 11:00:05 jj Exp $ +/* $Id: pgtsun4c.h,v 1.36 1998/07/26 03:05:44 davem Exp $ * pgtsun4c.h: Sun4c specific pgtable.h defines and code. * * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) @@ -47,6 +47,7 @@ * area, makes sense. This works out to the value below. */ #define SUN4C_VMALLOC_START (0xfe300000) +#define SUN4C_VMALLOC_END ~0x0UL /* * Sparc SUN4C pte fields. diff --git a/include/asm-sparc/processor.h b/include/asm-sparc/processor.h index cc5e3df5d..6f34d510b 100644 --- a/include/asm-sparc/processor.h +++ b/include/asm-sparc/processor.h @@ -1,4 +1,4 @@ -/* $Id: processor.h,v 1.62 1998/02/05 14:20:02 jj Exp $ +/* $Id: processor.h,v 1.67 1998/07/31 20:03:23 zaitcev Exp $ * include/asm-sparc/processor.h * * Copyright (C) 1994 David S. Miller (davem@caip.rutgers.edu) @@ -37,11 +37,6 @@ */ #define TASK_SIZE PAGE_OFFSET -#define COPY_TASK_STRUCT(dst, src) \ -do { \ - *dst = *src; \ -} while (0) - struct fpq { unsigned long *insn_addr; unsigned long insn; @@ -83,7 +78,6 @@ struct thread_struct { unsigned long fsr; unsigned long fpqdepth; struct fpq fpqueue[16]; - struct sigstack sstk_info; unsigned long flags; mm_segment_t current_ds; struct exec core_exec; /* just what it says. */ @@ -111,8 +105,6 @@ struct thread_struct { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, \ /* FPU status, FPU qdepth, FPU queue */ \ 0, 0, { { 0, 0, }, }, \ -/* sstk_info */ \ -{ 0, 0, }, \ /* flags, current_ds, */ \ SPARC_FLAG_KTHREAD, KERNEL_DS, \ /* core_exec */ \ @@ -154,8 +146,13 @@ extern __inline__ void start_thread(struct pt_regs * regs, unsigned long pc, /* Free all resources held by a thread. */ #define release_thread(tsk) do { } while(0) +#define copy_segments(nr, tsk, mm) do { } while (0) +#define release_segments(mm) do { } while (0) + #ifdef __KERNEL__ +extern struct task_struct *last_task_used_math; + /* Allocation and freeing of basic task resources. */ BTFIXUPDEF_CALL(struct task_struct *, alloc_task_struct, void) BTFIXUPDEF_CALL(void, free_task_struct, struct task_struct *) diff --git a/include/asm-sparc/sbus.h b/include/asm-sparc/sbus.h index 96a824dd9..e04656e6c 100644 --- a/include/asm-sparc/sbus.h +++ b/include/asm-sparc/sbus.h @@ -1,4 +1,4 @@ -/* $Id: sbus.h,v 1.14 1998/03/09 14:04:56 jj Exp $ +/* $Id: sbus.h,v 1.15 1998/05/22 14:33:36 jj Exp $ * sbus.h: Defines for the Sun SBus. * * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) @@ -52,7 +52,7 @@ struct linux_sbus_device { struct linux_prom_registers reg_addrs[PROMREG_MAX]; int num_registers, ranges_applied; - struct linux_prom_irqs irqs[PROMINTR_MAX]; + unsigned int irqs[4]; int num_irqs; unsigned long sbus_addr; /* Absolute base address for device. */ diff --git a/include/asm-sparc/siginfo.h b/include/asm-sparc/siginfo.h index 1d1d0a28e..0509aa1b3 100644 --- a/include/asm-sparc/siginfo.h +++ b/include/asm-sparc/siginfo.h @@ -1,4 +1,4 @@ -/* $Id: siginfo.h,v 1.1 1997/12/14 23:24:40 ecd Exp $ +/* $Id: siginfo.h,v 1.2 1998/07/30 11:31:49 davem Exp $ * siginfo.c: */ @@ -45,6 +45,7 @@ typedef struct siginfo { /* SIGCHLD */ struct { pid_t _pid; /* which child */ + uid_t _uid; /* sender's uid */ int _status; /* exit code */ clock_t _utime; clock_t _stime; diff --git a/include/asm-sparc/signal.h b/include/asm-sparc/signal.h index cdc8b27fc..c3517216b 100644 --- a/include/asm-sparc/signal.h +++ b/include/asm-sparc/signal.h @@ -1,4 +1,4 @@ -/* $Id: signal.h,v 1.31 1997/12/14 23:24:41 ecd Exp $ */ +/* $Id: signal.h,v 1.34 1998/07/29 16:32:38 jj Exp $ */ #ifndef _ASMSPARC_SIGNAL_H #define _ASMSPARC_SIGNAL_H @@ -75,6 +75,7 @@ #define SIGPROF 27 #define SIGWINCH 28 #define SIGLOST 29 +#define SIGPWR SIGLOST #define SIGUSR1 30 #define SIGUSR2 31 @@ -133,6 +134,7 @@ struct sigstack { */ #define SA_NOCLDSTOP SV_IGNCHILD #define SA_STACK SV_SSTACK +#define SA_ONSTACK SV_SSTACK #define SA_RESTART SV_INTR #define SA_ONESHOT SV_RESET #define SA_INTERRUPT 0x10 @@ -145,6 +147,15 @@ struct sigstack { #define SIG_UNBLOCK 0x02 /* for unblocking signals */ #define SIG_SETMASK 0x04 /* for setting the signal mask */ +/* + * sigaltstack controls + */ +#define SS_ONSTACK 1 +#define SS_DISABLE 2 + +#define MINSIGSTKSZ 4096 +#define SIGSTKSZ 16384 + #ifdef __KERNEL__ /* * These values of sa_flags are used only by the kernel as part of the diff --git a/include/asm-sparc/smp.h b/include/asm-sparc/smp.h index 8ecf68d08..3cbb49c86 100644 --- a/include/asm-sparc/smp.h +++ b/include/asm-sparc/smp.h @@ -43,16 +43,6 @@ struct cpuinfo_sparc { extern struct cpuinfo_sparc cpu_data[NR_CPUS]; extern unsigned long cpu_offset[NR_CPUS]; -struct klock_info { - unsigned char kernel_flag; - unsigned char akp; -}; - -extern struct klock_info klock_info; - -#define KLOCK_HELD 0xff -#define KLOCK_CLEAR 0x00 - /* * Private routines/data */ @@ -109,6 +99,10 @@ extern __volatile__ int cpu_number_map[NR_CPUS]; extern __volatile__ int __cpu_logical_map[NR_CPUS]; extern unsigned long smp_proc_in_lock[NR_CPUS]; +/* As idle task checks need_resched in a tight loop, it is not necessary to + wake it up. -jj */ +#define smp_send_reschedule(cpu) do {} while (0) + extern __inline__ int cpu_logical_map(int cpu) { return __cpu_logical_map[cpu]; @@ -192,13 +186,6 @@ extern __inline__ int hard_smp_processor_id(void) #define SMP_FROM_SYSCALL 2 #else /* !(__SMP__) */ -#ifndef __ASSEMBLY__ -extern __inline__ int cpu_logical_map(int cpu) -{ - return cpu; -} -#endif -#endif /* !(__SMP__) */ #define NO_PROC_ID 0xFF diff --git a/include/asm-sparc/smp_lock.h b/include/asm-sparc/smp_lock.h deleted file mode 100644 index 4f0a8e5f4..000000000 --- a/include/asm-sparc/smp_lock.h +++ /dev/null @@ -1,89 +0,0 @@ -/* smp_lock.h: 32-bit Sparc SMP master lock primitives. - * - * Copyright (C) 1996,1997 David S. Miller (davem@caip.rutgers.edu) - */ - -#ifndef __SPARC_SMPLOCK_H -#define __SPARC_SMPLOCK_H - -#include <asm/smp.h> -#include <asm/ptrace.h> - -#ifndef __SMP__ - -#define lock_kernel() do { } while(0) -#define unlock_kernel() do { } while(0) -#define release_kernel_lock(task, cpu, depth) ((depth) = 1) -#define reacquire_kernel_lock(task, cpu, depth) do { } while(0) - -#else - -#include <asm/hardirq.h> - -/* Release global kernel lock and global interrupt lock */ -#define release_kernel_lock(task, cpu, depth) \ -do { \ - if((depth = (task)->lock_depth) != 0) { \ - __cli(); \ - (task)->lock_depth = 0; \ - klock_info.akp = NO_PROC_ID; \ - klock_info.kernel_flag = 0; \ - } \ - release_irqlock(cpu); \ - __sti(); \ -} while(0) - -/* Do not fuck with this without consulting arch/sparc/lib/locks.S first! */ -#define reacquire_kernel_lock(task, cpu, depth) \ -do { \ - if(depth) { \ - register struct klock_info *klip asm("g1"); \ - register int proc asm("g5"); \ - klip = &klock_info; \ - proc = cpu; \ - __asm__ __volatile__("mov %%o7, %%g4\n\t" \ - "call ___lock_reacquire_kernel\n\t" \ - " mov %2, %%g2" \ - : /* No outputs. */ \ - : "r" (klip), "r" (proc), "r" (depth) \ - : "g2", "g3", "g4", "g7", "memory", "cc"); \ - } \ -} while(0) - -/* The following acquire and release the master kernel global lock, - * the idea is that the usage of this mechanmism becomes less and less - * as time goes on, to the point where they are no longer needed at all - * and can thus disappear. - */ - -/* Do not fuck with this without consulting arch/sparc/lib/locks.S first! */ -extern __inline__ void lock_kernel(void) -{ - register struct klock_info *klip asm("g1"); - register int proc asm("g5"); - klip = &klock_info; - proc = smp_processor_id(); - __asm__ __volatile__(" - mov %%o7, %%g4 - call ___lock_kernel - ld [%%g6 + %0], %%g2 -" : : "i" (AOFF_task_lock_depth), "r" (klip), "r" (proc) - : "g2", "g3", "g4", "g7", "memory", "cc"); -} - -/* Release kernel global lock. */ -extern __inline__ void unlock_kernel(void) -{ - register struct klock_info *klip asm("g1"); - klip = &klock_info; - __asm__ __volatile__(" - mov %%o7, %%g4 - call ___unlock_kernel - ld [%%g6 + %0], %%g2 -" : : "i" (AOFF_task_lock_depth), "r" (klip) - : "g2", "g3", "g4", "memory", "cc"); -} - -#endif /* !(__SPARC_SMPLOCK_H) */ - -#endif /* (__SMP__) */ diff --git a/include/asm-sparc/smplock.h b/include/asm-sparc/smplock.h new file mode 100644 index 000000000..e62326a10 --- /dev/null +++ b/include/asm-sparc/smplock.h @@ -0,0 +1,49 @@ +/* + * <asm/smplock.h> + * + * Default SMP lock implementation + */ +#include <linux/interrupt.h> +#include <asm/spinlock.h> + +extern spinlock_t kernel_flag; + +/* + * Release global kernel lock and global interrupt lock + */ +#define release_kernel_lock(task, cpu) \ +do { \ + if (task->lock_depth >= 0) \ + spin_unlock(&kernel_flag); \ + release_irqlock(cpu); \ + __sti(); \ +} while (0) + +/* + * Re-acquire the kernel lock + */ +#define reacquire_kernel_lock(task) \ +do { \ + if (task->lock_depth >= 0) \ + spin_lock(&kernel_flag); \ +} while (0) + + +/* + * Getting the big kernel lock. + * + * This cannot happen asynchronously, + * so we only need to worry about other + * CPU's. + */ +extern __inline__ void lock_kernel(void) +{ + if (!++current->lock_depth) + spin_lock(&kernel_flag); +} + +extern __inline__ void unlock_kernel(void) +{ + if (--current->lock_depth < 0) + spin_unlock(&kernel_flag); +} diff --git a/include/asm-sparc/socket.h b/include/asm-sparc/socket.h index 00be94356..ed60657ce 100644 --- a/include/asm-sparc/socket.h +++ b/include/asm-sparc/socket.h @@ -1,4 +1,4 @@ -/* $Id: socket.h,v 1.11 1997/10/19 00:19:14 davem Exp $ */ +/* $Id: socket.h,v 1.12 1998/07/22 22:06:48 davem Exp $ */ #ifndef _ASM_SOCKET_H #define _ASM_SOCKET_H @@ -37,6 +37,9 @@ #define SO_BINDTODEVICE 0x000d +#define SO_ATTACH_FILTER 0x001a +#define SO_DETACH_FILTER 0x001b + /* Security levels - as per NRL IPv6 - don't actually do anything */ #define SO_SECURITY_AUTHENTICATION 0x5001 #define SO_SECURITY_ENCRYPTION_TRANSPORT 0x5002 diff --git a/include/asm-sparc/softirq.h b/include/asm-sparc/softirq.h index 204ad53f8..50fbc20e7 100644 --- a/include/asm-sparc/softirq.h +++ b/include/asm-sparc/softirq.h @@ -99,6 +99,7 @@ extern int __sparc_bh_counter; #define softirq_trylock(cpu) (__sparc_bh_counter ? 0 : (__sparc_bh_counter=1)) #define softirq_endlock(cpu) (__sparc_bh_counter = 0) #define clear_active_bhs(x) (bh_active &= ~(x)) +#define synchronize_bh() do { } while (0) /* XXX implement SMP version -DaveM */ #define init_bh(nr, routine) \ do { int ent = nr; \ diff --git a/include/asm-sparc/spinlock.h b/include/asm-sparc/spinlock.h index c38b6af50..1683df48e 100644 --- a/include/asm-sparc/spinlock.h +++ b/include/asm-sparc/spinlock.h @@ -10,8 +10,13 @@ #ifndef __SMP__ -typedef struct { } spinlock_t; -#define SPIN_LOCK_UNLOCKED { } +#if (__GNUC__ > 2) || (__GNUC_MINOR__ >= 8) + typedef struct { } spinlock_t; + #define SPIN_LOCK_UNLOCKED { } +#else + typedef unsigned char spinlock_t; + #define SPIN_LOCK_UNLOCKED 0 +#endif #define spin_lock_init(lock) do { } while(0) #define spin_lock(lock) do { } while(0) @@ -67,7 +72,9 @@ typedef struct _spinlock_debug spinlock_t; #define SPIN_LOCK_UNLOCKED { 0, 0 } #define spin_lock_init(lp) do { (lp)->owner_pc = 0; (lp)->lock = 0; } while(0) -#define spin_unlock_wait(lp) do { barrier(); } while((lp)->lock) +#define spin_unlock_wait(lp) \ +do { barrier(); \ +} while(*(volatile unsigned char *)(&(lp)->lock)) extern void _spin_lock(spinlock_t *lock); extern int _spin_trylock(spinlock_t *lock); diff --git a/include/asm-sparc/stat.h b/include/asm-sparc/stat.h index 62038a4de..b1223ffc9 100644 --- a/include/asm-sparc/stat.h +++ b/include/asm-sparc/stat.h @@ -1,4 +1,4 @@ -/* $Id: stat.h,v 1.8 1998/02/06 12:52:07 jj Exp $ */ +/* $Id: stat.h,v 1.9 1998/07/26 05:24:39 davem Exp $ */ #ifndef _SPARC_STAT_H #define _SPARC_STAT_H @@ -38,40 +38,4 @@ struct stat { unsigned long __unused4[2]; }; -typedef struct { - __u32 major; - __u32 minor; -} __new_dev_t; - -struct stat64 { - __new_dev_t st_dev; - __u64 st_ino; - __u32 st_mode; - __u32 st_nlink; - __s32 st_uid; - __s32 st_gid; - __new_dev_t st_rdev; - __s64 st_size; - __u64 st_blocks; - __s32 st_atime; - __u32 __unused1; - __s32 st_mtime; - __u32 __unused2; - __s32 st_ctime; - __u32 __unused3; - __u32 st_blksize; - __u32 __unused4; -}; - -#define __XSTAT_VER_1 1 -#define __XSTAT_VER_2 2 -#define __XSTAT_VER_MASK 0xff - -#define __XSTAT_VER_XSTAT 0x000 -#define __XSTAT_VER_LXSTAT 0x100 -#define __XSTAT_VER_FXSTAT 0x200 -#define __XSTAT_VER_TYPEMASK 0xff00 - -#define __XMKNOD_VER_1 1 - #endif diff --git a/include/asm-sparc/sun4paddr.h b/include/asm-sparc/sun4paddr.h index a2c6ed390..d863bfd5f 100644 --- a/include/asm-sparc/sun4paddr.h +++ b/include/asm-sparc/sun4paddr.h @@ -1,19 +1,56 @@ -/* $Id: sun4paddr.h,v 1.2 1998/02/09 13:26:41 jj Exp $ +/* $Id: sun4paddr.h,v 1.3 1998/07/28 16:53:27 jj Exp $ * sun4paddr.h: Various physical addresses on sun4 machines * * Copyright (C) 1997 Anton Blanchard (anton@progsoc.uts.edu.au) + * Copyright (C) 1998 Chris Davis (cdavis@cois.on.ca) + * + * Now supports more sun4's */ #ifndef _SPARC_SUN4PADDR_H #define _SPARC_SUN4PADDR_H -#define SUN4_MEMREG_PHYSADDR 0xf4000000 #define SUN4_IE_PHYSADDR 0xf5000000 -#define SUN4_300_MOSTEK_PHYSADDR 0xf2000000 +#define SUN4_UNUSED_PHYSADDR 0 + +/* these work for me */ +#define SUN4_200_MEMREG_PHYSADDR 0xf4000000 +#define SUN4_200_CLOCK_PHYSADDR 0xf3000000 +#define SUN4_200_BWTWO_PHYSADDR 0xfd000000 +#define SUN4_200_ETH_PHYSADDR 0xf6000000 +#define SUN4_200_SI_PHYSADDR 0xff200000 + +/* these were here before */ +#define SUN4_300_MEMREG_PHYSADDR 0xf4000000 +#define SUN4_300_CLOCK_PHYSADDR 0xf2000000 #define SUN4_300_TIMER_PHYSADDR 0xef000000 #define SUN4_300_ETH_PHYSADDR 0xf9000000 #define SUN4_300_BWTWO_PHYSADDR 0xfb400000 #define SUN4_300_DMA_PHYSADDR 0xfa001000 #define SUN4_300_ESP_PHYSADDR 0xfa000000 +/* Are these right? */ +#define SUN4_400_MEMREG_PHYSADDR 0xf4000000 +#define SUN4_400_CLOCK_PHYSADDR 0xf2000000 +#define SUN4_400_TIMER_PHYSADDR 0xef000000 +#define SUN4_400_ETH_PHYSADDR 0xf9000000 +#define SUN4_400_BWTWO_PHYSADDR 0xfb400000 +#define SUN4_400_DMA_PHYSADDR 0xfa001000 +#define SUN4_400_ESP_PHYSADDR 0xfa000000 + +/* + these are the actual values set and used in the code. Unused items set + to SUN_UNUSED_PHYSADDR + */ + +extern int sun4_memreg_physaddr; /* memory register (ecc?) */ +extern int sun4_clock_physaddr; /* system clock */ +extern int sun4_timer_physaddr; /* timer, where applicable */ +extern int sun4_eth_physaddr; /* onboard ethernet (ie/le) */ +extern int sun4_si_physaddr; /* sun3 scsi adapter */ +extern int sun4_bwtwo_physaddr; /* onboard bw2 */ +extern int sun4_dma_physaddr; /* scsi dma */ +extern int sun4_esp_physaddr; /* esp scsi */ +extern int sun4_ie_physaddr; /* interrupt enable */ + #endif /* !(_SPARC_SUN4PADDR_H) */ diff --git a/include/asm-sparc/svr4.h b/include/asm-sparc/svr4.h index 7d163a6fc..331157291 100644 --- a/include/asm-sparc/svr4.h +++ b/include/asm-sparc/svr4.h @@ -80,7 +80,7 @@ typedef struct { /* flags for stack_t.flags */ enum svr4_stack_flags { - SS_ONSTACK, + SVR4_SS_ONSTACK, SVR4_SS_DISABLE, }; diff --git a/include/asm-sparc/system.h b/include/asm-sparc/system.h index 2ddecf4fe..01ed7659e 100644 --- a/include/asm-sparc/system.h +++ b/include/asm-sparc/system.h @@ -1,4 +1,4 @@ -/* $Id: system.h,v 1.68 1998/03/09 14:04:51 jj Exp $ */ +/* $Id: system.h,v 1.69 1998/04/24 12:30:19 davem Exp $ */ #include <linux/config.h> #ifndef __SPARC_SYSTEM_H diff --git a/include/asm-sparc/termios.h b/include/asm-sparc/termios.h index 23f293eaa..3c681a7b1 100644 --- a/include/asm-sparc/termios.h +++ b/include/asm-sparc/termios.h @@ -1,4 +1,4 @@ -/* $Id: termios.h,v 1.25 1997/03/04 19:36:18 davem Exp $ */ +/* $Id: termios.h,v 1.26 1998/04/12 06:27:19 davem Exp $ */ #ifndef _SPARC_TERMIOS_H #define _SPARC_TERMIOS_H diff --git a/include/asm-sparc/timer.h b/include/asm-sparc/timer.h index 91add4f49..f1b41f7e4 100644 --- a/include/asm-sparc/timer.h +++ b/include/asm-sparc/timer.h @@ -1,4 +1,4 @@ -/* $Id: timer.h,v 1.16 1998/01/30 10:59:59 jj Exp $ +/* $Id: timer.h,v 1.17 1998/04/24 12:30:19 davem Exp $ * timer.h: Definitions for the timer chips on the Sparc. * * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) diff --git a/include/asm-sparc/timex.h b/include/asm-sparc/timex.h new file mode 100644 index 000000000..4b2b3850f --- /dev/null +++ b/include/asm-sparc/timex.h @@ -0,0 +1,15 @@ +/* + * linux/include/asm-sparc/timex.h + * + * sparc architecture timex specifications + */ +#ifndef _ASMsparc_TIMEX_H +#define _ASMsparc_TIMEX_H + +#define CLOCK_TICK_RATE 1193180 /* Underlying HZ */ +#define CLOCK_TICK_FACTOR 20 /* Factor of both 1000000 and CLOCK_TICK_RATE */ +#define FINETUNE ((((((long)LATCH * HZ - CLOCK_TICK_RATE) << SHIFT_HZ) * \ + (1000000/CLOCK_TICK_FACTOR) / (CLOCK_TICK_RATE/CLOCK_TICK_FACTOR)) \ + << (SHIFT_SCALE-SHIFT_HZ)) / HZ) + +#endif diff --git a/include/asm-sparc/unistd.h b/include/asm-sparc/unistd.h index 7682680a4..dae8e0ac3 100644 --- a/include/asm-sparc/unistd.h +++ b/include/asm-sparc/unistd.h @@ -1,4 +1,4 @@ -/* $Id: unistd.h,v 1.38 1998/03/27 07:01:56 davem Exp $ */ +/* $Id: unistd.h,v 1.42 1998/07/28 13:08:35 jj Exp $ */ #ifndef _SPARC_UNISTD_H #define _SPARC_UNISTD_H @@ -29,22 +29,22 @@ #define __NR_unlink 10 /* Common */ #define __NR_execv 11 /* SunOS Specific */ #define __NR_chdir 12 /* Common */ -#define __NR_xstat 13 /* Linux Specific */ +/* #define __NR_ni_syscall 13 ENOSYS under SunOS */ #define __NR_mknod 14 /* Common */ #define __NR_chmod 15 /* Common */ #define __NR_chown 16 /* Common */ #define __NR_brk 17 /* Common */ -#define __NR_xmknod 18 /* Linux Specific */ +/* #define __NR_ni_syscall 18 ENOSYS under SunOS */ #define __NR_lseek 19 /* Common */ #define __NR_getpid 20 /* Common */ -/* #define __NR_ni_syscall 21 ENOSYS under SunOS */ -/* #define __NR_ni_syscall 22 ENOSYS under SunOS */ +#define __NR_capget 21 /* Linux Specific */ +#define __NR_capset 22 /* Linux Specific */ #define __NR_setuid 23 /* Implemented via setreuid in SunOS */ #define __NR_getuid 24 /* Common */ /* #define __NR_ni_syscall 25 ENOSYS under SunOS */ #define __NR_ptrace 26 /* Common */ #define __NR_alarm 27 /* Implemented via setitimer in SunOS */ -/* #define __NR_ni_syscall 28 ENOSYS under SunOS */ +#define __NR_sigaltstack 28 /* Common */ #define __NR_pause 29 /* Is sigblock(0)->sigpause() in SunOS */ #define __NR_utime 30 /* Implemented via utimes() under SunOS */ #define __NR_stty 31 /* Implemented via ioctl() under SunOS */ @@ -55,7 +55,7 @@ #define __NR_sync 36 /* Common */ #define __NR_kill 37 /* Common */ #define __NR_stat 38 /* Common */ -/* #define __NR_ni_syscall 39 ENOSYS under SunOS */ +#define __NR_sendfile 39 /* Linux Specific */ #define __NR_lstat 40 /* Common */ #define __NR_dup 41 /* Common */ #define __NR_pipe 42 /* Common */ @@ -135,7 +135,7 @@ #define __NR_gettimeofday 116 /* Common */ #define __NR_getrusage 117 /* Common */ #define __NR_getsockopt 118 /* Common */ -/* #define __NR_ni_syscall 119 ENOSYS under SunOS */ +#define __NR_getcwd 119 /* Linux Specific */ #define __NR_readv 120 /* Common */ #define __NR_writev 121 /* Common */ #define __NR_settimeofday 122 /* Common */ diff --git a/include/asm-sparc/xstat.h b/include/asm-sparc/xstat.h deleted file mode 100644 index 53b1d59d0..000000000 --- a/include/asm-sparc/xstat.h +++ /dev/null @@ -1,35 +0,0 @@ -/* $Id: xstat.h,v 1.1 1998/02/06 12:52:08 jj Exp $ - * xstat.h: sys_xstat/xmknod architecture dependent stuff. - * - * Copyright (C) 1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) - */ - -extern __inline__ int cp_xstat(struct inode *inode, struct stat64 *s, unsigned long blocks, int blksize) -{ - struct stat64 tmp; - - memset (&tmp, 0, sizeof(tmp)); - tmp.st_dev.major = MAJOR(inode->i_dev); - tmp.st_dev.minor = MINOR(inode->i_dev); - tmp.st_ino = inode->i_ino; - tmp.st_mode = inode->i_mode; - tmp.st_nlink = inode->i_nlink; - tmp.st_uid = inode->i_uid; - tmp.st_gid = inode->i_gid; - tmp.st_rdev.major = MAJOR(inode->i_rdev); - tmp.st_rdev.minor = MINOR(inode->i_rdev); - tmp.st_size = inode->i_size; - tmp.st_blksize = blksize; - tmp.st_blocks = blocks; - tmp.st_atime = inode->i_atime; - tmp.st_mtime = inode->i_mtime; - tmp.st_ctime = inode->i_ctime; - return copy_to_user(s,&tmp,sizeof(tmp)); -} - -extern __inline__ int get_user_new_dev_t(kdev_t *kdev, __new_dev_t *udev) { - __new_dev_t ndev; - if (copy_from_user (&ndev, udev, sizeof(__new_dev_t))) return -EFAULT; - *kdev = MKDEV(ndev.major, ndev.minor); - return 0; -} diff --git a/include/asm-sparc64/asm_offsets.h b/include/asm-sparc64/asm_offsets.h index 36b684ae6..bc1bdb8dc 100644 --- a/include/asm-sparc64/asm_offsets.h +++ b/include/asm-sparc64/asm_offsets.h @@ -14,170 +14,176 @@ #define ASIZ_task_addr_limit 0x00000008 #define AOFF_task_exec_domain 0x00000020 #define ASIZ_task_exec_domain 0x00000008 -#define AOFF_task_debugreg 0x00000028 -#define ASIZ_task_debugreg 0x00000040 -#define AOFF_task_counter 0x00000068 +#define AOFF_task_need_resched 0x00000028 +#define ASIZ_task_need_resched 0x00000008 +#define AOFF_task_counter 0x00000030 #define ASIZ_task_counter 0x00000008 -#define AOFF_task_priority 0x00000070 +#define AOFF_task_priority 0x00000038 #define ASIZ_task_priority 0x00000008 -#define AOFF_task_binfmt 0x00000078 -#define ASIZ_task_binfmt 0x00000008 -#define AOFF_task_next_task 0x00000080 +#define AOFF_task_has_cpu 0x00000040 +#define ASIZ_task_has_cpu 0x00000004 +#define AOFF_task_processor 0x00000044 +#define ASIZ_task_processor 0x00000004 +#define AOFF_task_last_processor 0x00000048 +#define ASIZ_task_last_processor 0x00000004 +#define AOFF_task_lock_depth 0x0000004c +#define ASIZ_task_lock_depth 0x00000004 +#define AOFF_task_next_task 0x00000050 #define ASIZ_task_next_task 0x00000008 -#define AOFF_task_prev_task 0x00000088 +#define AOFF_task_prev_task 0x00000058 #define ASIZ_task_prev_task 0x00000008 -#define AOFF_task_next_run 0x00000090 +#define AOFF_task_next_run 0x00000060 #define ASIZ_task_next_run 0x00000008 -#define AOFF_task_prev_run 0x00000098 +#define AOFF_task_prev_run 0x00000068 #define ASIZ_task_prev_run 0x00000008 -#define AOFF_task_exit_code 0x000000a0 +#define AOFF_task_binfmt 0x00000070 +#define ASIZ_task_binfmt 0x00000008 +#define AOFF_task_exit_code 0x00000078 #define ASIZ_task_exit_code 0x00000004 -#define AOFF_task_exit_signal 0x000000a4 +#define AOFF_task_exit_signal 0x0000007c #define ASIZ_task_exit_signal 0x00000004 -#define AOFF_task_pdeath_signal 0x000000a8 +#define AOFF_task_pdeath_signal 0x00000080 #define ASIZ_task_pdeath_signal 0x00000004 -#define AOFF_task_personality 0x000000b0 +#define AOFF_task_personality 0x00000088 #define ASIZ_task_personality 0x00000008 -#define AOFF_task_pid 0x000000bc +#define AOFF_task_pid 0x00000094 #define ASIZ_task_pid 0x00000004 -#define AOFF_task_pgrp 0x000000c0 +#define AOFF_task_pgrp 0x00000098 #define ASIZ_task_pgrp 0x00000004 -#define AOFF_task_tty_old_pgrp 0x000000c4 +#define AOFF_task_tty_old_pgrp 0x0000009c #define ASIZ_task_tty_old_pgrp 0x00000004 -#define AOFF_task_session 0x000000c8 +#define AOFF_task_session 0x000000a0 #define ASIZ_task_session 0x00000004 -#define AOFF_task_leader 0x000000cc +#define AOFF_task_leader 0x000000a4 #define ASIZ_task_leader 0x00000004 -#define AOFF_task_ngroups 0x000000d0 -#define ASIZ_task_ngroups 0x00000004 -#define AOFF_task_groups 0x000000d4 -#define ASIZ_task_groups 0x00000080 -#define AOFF_task_p_opptr 0x00000158 +#define AOFF_task_p_opptr 0x000000a8 #define ASIZ_task_p_opptr 0x00000008 -#define AOFF_task_p_pptr 0x00000160 +#define AOFF_task_p_pptr 0x000000b0 #define ASIZ_task_p_pptr 0x00000008 -#define AOFF_task_p_cptr 0x00000168 +#define AOFF_task_p_cptr 0x000000b8 #define ASIZ_task_p_cptr 0x00000008 -#define AOFF_task_p_ysptr 0x00000170 +#define AOFF_task_p_ysptr 0x000000c0 #define ASIZ_task_p_ysptr 0x00000008 -#define AOFF_task_p_osptr 0x00000178 +#define AOFF_task_p_osptr 0x000000c8 #define ASIZ_task_p_osptr 0x00000008 -#define AOFF_task_pidhash_next 0x00000180 +#define AOFF_task_pidhash_next 0x000000d0 #define ASIZ_task_pidhash_next 0x00000008 -#define AOFF_task_pidhash_pprev 0x00000188 +#define AOFF_task_pidhash_pprev 0x000000d8 #define ASIZ_task_pidhash_pprev 0x00000008 -#define AOFF_task_tarray_ptr 0x00000190 +#define AOFF_task_tarray_ptr 0x000000e0 #define ASIZ_task_tarray_ptr 0x00000008 -#define AOFF_task_wait_chldexit 0x00000198 +#define AOFF_task_wait_chldexit 0x000000e8 #define ASIZ_task_wait_chldexit 0x00000008 -#define AOFF_task_uid 0x000001a0 -#define ASIZ_task_uid 0x00000004 -#define AOFF_task_euid 0x000001a4 -#define ASIZ_task_euid 0x00000004 -#define AOFF_task_suid 0x000001a8 -#define ASIZ_task_suid 0x00000004 -#define AOFF_task_fsuid 0x000001ac -#define ASIZ_task_fsuid 0x00000004 -#define AOFF_task_gid 0x000001b0 -#define ASIZ_task_gid 0x00000004 -#define AOFF_task_egid 0x000001b4 -#define ASIZ_task_egid 0x00000004 -#define AOFF_task_sgid 0x000001b8 -#define ASIZ_task_sgid 0x00000004 -#define AOFF_task_fsgid 0x000001bc -#define ASIZ_task_fsgid 0x00000004 -#define AOFF_task_timeout 0x000001c0 +#define AOFF_task_timeout 0x000000f0 #define ASIZ_task_timeout 0x00000008 -#define AOFF_task_policy 0x000001c8 +#define AOFF_task_policy 0x000000f8 #define ASIZ_task_policy 0x00000008 -#define AOFF_task_rt_priority 0x000001d0 +#define AOFF_task_rt_priority 0x00000100 #define ASIZ_task_rt_priority 0x00000008 -#define AOFF_task_it_real_value 0x000001d8 +#define AOFF_task_it_real_value 0x00000108 #define ASIZ_task_it_real_value 0x00000008 -#define AOFF_task_it_prof_value 0x000001e0 +#define AOFF_task_it_prof_value 0x00000110 #define ASIZ_task_it_prof_value 0x00000008 -#define AOFF_task_it_virt_value 0x000001e8 +#define AOFF_task_it_virt_value 0x00000118 #define ASIZ_task_it_virt_value 0x00000008 -#define AOFF_task_it_real_incr 0x000001f0 +#define AOFF_task_it_real_incr 0x00000120 #define ASIZ_task_it_real_incr 0x00000008 -#define AOFF_task_it_prof_incr 0x000001f8 +#define AOFF_task_it_prof_incr 0x00000128 #define ASIZ_task_it_prof_incr 0x00000008 -#define AOFF_task_it_virt_incr 0x00000200 +#define AOFF_task_it_virt_incr 0x00000130 #define ASIZ_task_it_virt_incr 0x00000008 -#define AOFF_task_real_timer 0x00000208 +#define AOFF_task_real_timer 0x00000138 #define ASIZ_task_real_timer 0x00000028 -#define AOFF_task_times 0x00000230 +#define AOFF_task_times 0x00000160 #define ASIZ_task_times 0x00000020 -#define AOFF_task_start_time 0x00000250 +#define AOFF_task_start_time 0x00000180 #define ASIZ_task_start_time 0x00000008 -#define AOFF_task_per_cpu_utime 0x00000258 +#define AOFF_task_per_cpu_utime 0x00000188 #define ASIZ_task_per_cpu_utime 0x00000008 -#define AOFF_task_min_flt 0x00000268 +#define AOFF_task_min_flt 0x00000198 #define ASIZ_task_min_flt 0x00000008 -#define AOFF_task_maj_flt 0x00000270 +#define AOFF_task_maj_flt 0x000001a0 #define ASIZ_task_maj_flt 0x00000008 -#define AOFF_task_nswap 0x00000278 +#define AOFF_task_nswap 0x000001a8 #define ASIZ_task_nswap 0x00000008 -#define AOFF_task_cmin_flt 0x00000280 +#define AOFF_task_cmin_flt 0x000001b0 #define ASIZ_task_cmin_flt 0x00000008 -#define AOFF_task_cmaj_flt 0x00000288 +#define AOFF_task_cmaj_flt 0x000001b8 #define ASIZ_task_cmaj_flt 0x00000008 -#define AOFF_task_cnswap 0x00000290 +#define AOFF_task_cnswap 0x000001c0 #define ASIZ_task_cnswap 0x00000008 -#define AOFF_task_swap_address 0x000002a0 +#define AOFF_task_swap_address 0x000001d0 #define ASIZ_task_swap_address 0x00000008 -#define AOFF_task_old_maj_flt 0x000002a8 +#define AOFF_task_old_maj_flt 0x000001d8 #define ASIZ_task_old_maj_flt 0x00000008 -#define AOFF_task_dec_flt 0x000002b0 +#define AOFF_task_dec_flt 0x000001e0 #define ASIZ_task_dec_flt 0x00000008 -#define AOFF_task_swap_cnt 0x000002b8 +#define AOFF_task_swap_cnt 0x000001e8 #define ASIZ_task_swap_cnt 0x00000008 -#define AOFF_task_rlim 0x000002c0 +#define AOFF_task_uid 0x000001f0 +#define ASIZ_task_uid 0x00000004 +#define AOFF_task_euid 0x000001f4 +#define ASIZ_task_euid 0x00000004 +#define AOFF_task_suid 0x000001f8 +#define ASIZ_task_suid 0x00000004 +#define AOFF_task_fsuid 0x000001fc +#define ASIZ_task_fsuid 0x00000004 +#define AOFF_task_gid 0x00000200 +#define ASIZ_task_gid 0x00000004 +#define AOFF_task_egid 0x00000204 +#define ASIZ_task_egid 0x00000004 +#define AOFF_task_sgid 0x00000208 +#define ASIZ_task_sgid 0x00000004 +#define AOFF_task_fsgid 0x0000020c +#define ASIZ_task_fsgid 0x00000004 +#define AOFF_task_ngroups 0x00000210 +#define ASIZ_task_ngroups 0x00000004 +#define AOFF_task_groups 0x00000214 +#define ASIZ_task_groups 0x00000080 +#define AOFF_task_cap_effective 0x00000294 +#define ASIZ_task_cap_effective 0x00000004 +#define AOFF_task_cap_inheritable 0x00000298 +#define ASIZ_task_cap_inheritable 0x00000004 +#define AOFF_task_cap_permitted 0x0000029c +#define ASIZ_task_cap_permitted 0x00000004 +#define AOFF_task_rlim 0x000002a0 #define ASIZ_task_rlim 0x000000a0 -#define AOFF_task_used_math 0x00000360 +#define AOFF_task_used_math 0x00000340 #define ASIZ_task_used_math 0x00000002 -#define AOFF_task_io_usage 0x00000368 -#define ASIZ_task_io_usage 0x00000008 -#define AOFF_task_comm 0x00000370 +#define AOFF_task_comm 0x00000342 #define ASIZ_task_comm 0x00000010 -#define AOFF_task_link_count 0x00000380 +#define AOFF_task_link_count 0x00000354 #define ASIZ_task_link_count 0x00000004 -#define AOFF_task_tty 0x00000388 +#define AOFF_task_tty 0x00000358 #define ASIZ_task_tty 0x00000008 -#define AOFF_task_semundo 0x00000390 +#define AOFF_task_semundo 0x00000360 #define ASIZ_task_semundo 0x00000008 -#define AOFF_task_semsleeping 0x00000398 +#define AOFF_task_semsleeping 0x00000368 #define ASIZ_task_semsleeping 0x00000008 -#define AOFF_task_ldt 0x000003a0 -#define ASIZ_task_ldt 0x00000008 -#define AOFF_task_tss 0x000003b0 -#define ASIZ_task_tss 0x00000490 -#define AOFF_task_fs 0x00000840 +#define AOFF_task_tss 0x00000370 +#define ASIZ_task_tss 0x00000440 +#define AOFF_task_fs 0x000007b0 #define ASIZ_task_fs 0x00000008 -#define AOFF_task_files 0x00000848 +#define AOFF_task_files 0x000007b8 #define ASIZ_task_files 0x00000008 -#define AOFF_task_mm 0x00000850 +#define AOFF_task_mm 0x000007c0 #define ASIZ_task_mm 0x00000008 -#define AOFF_task_sig 0x00000858 +#define AOFF_task_sigmask_lock 0x000007c8 +#define ASIZ_task_sigmask_lock 0x00000000 +#define AOFF_task_sig 0x000007c8 #define ASIZ_task_sig 0x00000008 -#define AOFF_task_signal 0x00000860 +#define AOFF_task_signal 0x000007d0 #define ASIZ_task_signal 0x00000008 -#define AOFF_task_blocked 0x00000868 +#define AOFF_task_blocked 0x000007d8 #define ASIZ_task_blocked 0x00000008 -#define AOFF_task_sigqueue 0x00000870 +#define AOFF_task_sigqueue 0x000007e0 #define ASIZ_task_sigqueue 0x00000008 -#define AOFF_task_sigqueue_tail 0x00000878 +#define AOFF_task_sigqueue_tail 0x000007e8 #define ASIZ_task_sigqueue_tail 0x00000008 -#define AOFF_task_has_cpu 0x00000880 -#define ASIZ_task_has_cpu 0x00000004 -#define AOFF_task_processor 0x00000884 -#define ASIZ_task_processor 0x00000004 -#define AOFF_task_last_processor 0x00000888 -#define ASIZ_task_last_processor 0x00000004 -#define AOFF_task_lock_depth 0x0000088c -#define ASIZ_task_lock_depth 0x00000004 -#define AOFF_task_sigmask_lock 0x00000890 -#define ASIZ_task_sigmask_lock 0x00000000 +#define AOFF_task_sas_ss_sp 0x000007f0 +#define ASIZ_task_sas_ss_sp 0x00000008 +#define AOFF_task_sas_ss_size 0x000007f8 +#define ASIZ_task_sas_ss_size 0x00000008 #define AOFF_mm_mmap 0x00000000 #define ASIZ_mm_mmap 0x00000008 #define AOFF_mm_mmap_cache 0x00000008 @@ -224,22 +230,24 @@ #define ASIZ_mm_def_flags 0x00000008 #define AOFF_mm_cpu_vm_mask 0x000000b0 #define ASIZ_mm_cpu_vm_mask 0x00000008 +#define AOFF_mm_segments 0x000000b8 +#define ASIZ_mm_segments 0x00000008 #define AOFF_thread_ksp 0x00000000 #define ASIZ_thread_ksp 0x00000008 -#define AOFF_thread_kpc 0x00000008 -#define ASIZ_thread_kpc 0x00000004 -#define AOFF_thread_wstate 0x0000000c +#define AOFF_thread_wstate 0x00000008 #define ASIZ_thread_wstate 0x00000002 -#define AOFF_thread_cwp 0x0000000e +#define AOFF_thread_cwp 0x0000000a #define ASIZ_thread_cwp 0x00000002 -#define AOFF_thread_flags 0x00000010 +#define AOFF_thread_flags 0x0000000c #define ASIZ_thread_flags 0x00000002 -#define AOFF_thread_ctx 0x00000012 +#define AOFF_thread_ctx 0x0000000e #define ASIZ_thread_ctx 0x00000002 -#define AOFF_thread_w_saved 0x00000014 +#define AOFF_thread_w_saved 0x00000010 #define ASIZ_thread_w_saved 0x00000002 -#define AOFF_thread_new_signal 0x00000016 +#define AOFF_thread_new_signal 0x00000012 #define ASIZ_thread_new_signal 0x00000002 +#define AOFF_thread____pad 0x00000014 +#define ASIZ_thread____pad 0x00000004 #define AOFF_thread_current_ds 0x00000018 #define ASIZ_thread_current_ds 0x00000008 #define AOFF_thread_kregs 0x00000020 @@ -247,15 +255,21 @@ #define AOFF_thread_utraps 0x00000028 #define ASIZ_thread_utraps 0x00000008 #define AOFF_thread_reg_window 0x00000030 -#define ASIZ_thread_reg_window 0x00000400 -#define AOFF_thread_rwbuf_stkptrs 0x00000430 -#define ASIZ_thread_rwbuf_stkptrs 0x00000040 -#define AOFF_thread_sig_address 0x00000470 +#define ASIZ_thread_reg_window 0x00000380 +#define AOFF_thread_rwbuf_stkptrs 0x000003b0 +#define ASIZ_thread_rwbuf_stkptrs 0x00000038 +#define AOFF_thread_sig_address 0x000003e8 #define ASIZ_thread_sig_address 0x00000008 -#define AOFF_thread_sig_desc 0x00000478 +#define AOFF_thread_sig_desc 0x000003f0 #define ASIZ_thread_sig_desc 0x00000008 -#define AOFF_thread_sstk_info 0x00000480 -#define ASIZ_thread_sstk_info 0x00000010 +#define AOFF_thread_fpdepth 0x000003f8 +#define ASIZ_thread_fpdepth 0x00000001 +#define AOFF_thread_fpsaved 0x000003f9 +#define ASIZ_thread_fpsaved 0x00000007 +#define AOFF_thread_gsr 0x00000400 +#define ASIZ_thread_gsr 0x00000007 +#define AOFF_thread_xfsr 0x00000408 +#define ASIZ_thread_xfsr 0x00000038 #else /* __SMP__ */ @@ -269,170 +283,176 @@ #define ASIZ_task_addr_limit 0x00000008 #define AOFF_task_exec_domain 0x00000020 #define ASIZ_task_exec_domain 0x00000008 -#define AOFF_task_debugreg 0x00000028 -#define ASIZ_task_debugreg 0x00000040 -#define AOFF_task_counter 0x00000068 +#define AOFF_task_need_resched 0x00000028 +#define ASIZ_task_need_resched 0x00000008 +#define AOFF_task_counter 0x00000030 #define ASIZ_task_counter 0x00000008 -#define AOFF_task_priority 0x00000070 +#define AOFF_task_priority 0x00000038 #define ASIZ_task_priority 0x00000008 -#define AOFF_task_binfmt 0x00000078 -#define ASIZ_task_binfmt 0x00000008 -#define AOFF_task_next_task 0x00000080 +#define AOFF_task_has_cpu 0x00000040 +#define ASIZ_task_has_cpu 0x00000004 +#define AOFF_task_processor 0x00000044 +#define ASIZ_task_processor 0x00000004 +#define AOFF_task_last_processor 0x00000048 +#define ASIZ_task_last_processor 0x00000004 +#define AOFF_task_lock_depth 0x0000004c +#define ASIZ_task_lock_depth 0x00000004 +#define AOFF_task_next_task 0x00000050 #define ASIZ_task_next_task 0x00000008 -#define AOFF_task_prev_task 0x00000088 +#define AOFF_task_prev_task 0x00000058 #define ASIZ_task_prev_task 0x00000008 -#define AOFF_task_next_run 0x00000090 +#define AOFF_task_next_run 0x00000060 #define ASIZ_task_next_run 0x00000008 -#define AOFF_task_prev_run 0x00000098 +#define AOFF_task_prev_run 0x00000068 #define ASIZ_task_prev_run 0x00000008 -#define AOFF_task_exit_code 0x000000a0 +#define AOFF_task_binfmt 0x00000070 +#define ASIZ_task_binfmt 0x00000008 +#define AOFF_task_exit_code 0x00000078 #define ASIZ_task_exit_code 0x00000004 -#define AOFF_task_exit_signal 0x000000a4 +#define AOFF_task_exit_signal 0x0000007c #define ASIZ_task_exit_signal 0x00000004 -#define AOFF_task_pdeath_signal 0x000000a8 +#define AOFF_task_pdeath_signal 0x00000080 #define ASIZ_task_pdeath_signal 0x00000004 -#define AOFF_task_personality 0x000000b0 +#define AOFF_task_personality 0x00000088 #define ASIZ_task_personality 0x00000008 -#define AOFF_task_pid 0x000000bc +#define AOFF_task_pid 0x00000094 #define ASIZ_task_pid 0x00000004 -#define AOFF_task_pgrp 0x000000c0 +#define AOFF_task_pgrp 0x00000098 #define ASIZ_task_pgrp 0x00000004 -#define AOFF_task_tty_old_pgrp 0x000000c4 +#define AOFF_task_tty_old_pgrp 0x0000009c #define ASIZ_task_tty_old_pgrp 0x00000004 -#define AOFF_task_session 0x000000c8 +#define AOFF_task_session 0x000000a0 #define ASIZ_task_session 0x00000004 -#define AOFF_task_leader 0x000000cc +#define AOFF_task_leader 0x000000a4 #define ASIZ_task_leader 0x00000004 -#define AOFF_task_ngroups 0x000000d0 -#define ASIZ_task_ngroups 0x00000004 -#define AOFF_task_groups 0x000000d4 -#define ASIZ_task_groups 0x00000080 -#define AOFF_task_p_opptr 0x00000158 +#define AOFF_task_p_opptr 0x000000a8 #define ASIZ_task_p_opptr 0x00000008 -#define AOFF_task_p_pptr 0x00000160 +#define AOFF_task_p_pptr 0x000000b0 #define ASIZ_task_p_pptr 0x00000008 -#define AOFF_task_p_cptr 0x00000168 +#define AOFF_task_p_cptr 0x000000b8 #define ASIZ_task_p_cptr 0x00000008 -#define AOFF_task_p_ysptr 0x00000170 +#define AOFF_task_p_ysptr 0x000000c0 #define ASIZ_task_p_ysptr 0x00000008 -#define AOFF_task_p_osptr 0x00000178 +#define AOFF_task_p_osptr 0x000000c8 #define ASIZ_task_p_osptr 0x00000008 -#define AOFF_task_pidhash_next 0x00000180 +#define AOFF_task_pidhash_next 0x000000d0 #define ASIZ_task_pidhash_next 0x00000008 -#define AOFF_task_pidhash_pprev 0x00000188 +#define AOFF_task_pidhash_pprev 0x000000d8 #define ASIZ_task_pidhash_pprev 0x00000008 -#define AOFF_task_tarray_ptr 0x00000190 +#define AOFF_task_tarray_ptr 0x000000e0 #define ASIZ_task_tarray_ptr 0x00000008 -#define AOFF_task_wait_chldexit 0x00000198 +#define AOFF_task_wait_chldexit 0x000000e8 #define ASIZ_task_wait_chldexit 0x00000008 -#define AOFF_task_uid 0x000001a0 -#define ASIZ_task_uid 0x00000004 -#define AOFF_task_euid 0x000001a4 -#define ASIZ_task_euid 0x00000004 -#define AOFF_task_suid 0x000001a8 -#define ASIZ_task_suid 0x00000004 -#define AOFF_task_fsuid 0x000001ac -#define ASIZ_task_fsuid 0x00000004 -#define AOFF_task_gid 0x000001b0 -#define ASIZ_task_gid 0x00000004 -#define AOFF_task_egid 0x000001b4 -#define ASIZ_task_egid 0x00000004 -#define AOFF_task_sgid 0x000001b8 -#define ASIZ_task_sgid 0x00000004 -#define AOFF_task_fsgid 0x000001bc -#define ASIZ_task_fsgid 0x00000004 -#define AOFF_task_timeout 0x000001c0 +#define AOFF_task_timeout 0x000000f0 #define ASIZ_task_timeout 0x00000008 -#define AOFF_task_policy 0x000001c8 +#define AOFF_task_policy 0x000000f8 #define ASIZ_task_policy 0x00000008 -#define AOFF_task_rt_priority 0x000001d0 +#define AOFF_task_rt_priority 0x00000100 #define ASIZ_task_rt_priority 0x00000008 -#define AOFF_task_it_real_value 0x000001d8 +#define AOFF_task_it_real_value 0x00000108 #define ASIZ_task_it_real_value 0x00000008 -#define AOFF_task_it_prof_value 0x000001e0 +#define AOFF_task_it_prof_value 0x00000110 #define ASIZ_task_it_prof_value 0x00000008 -#define AOFF_task_it_virt_value 0x000001e8 +#define AOFF_task_it_virt_value 0x00000118 #define ASIZ_task_it_virt_value 0x00000008 -#define AOFF_task_it_real_incr 0x000001f0 +#define AOFF_task_it_real_incr 0x00000120 #define ASIZ_task_it_real_incr 0x00000008 -#define AOFF_task_it_prof_incr 0x000001f8 +#define AOFF_task_it_prof_incr 0x00000128 #define ASIZ_task_it_prof_incr 0x00000008 -#define AOFF_task_it_virt_incr 0x00000200 +#define AOFF_task_it_virt_incr 0x00000130 #define ASIZ_task_it_virt_incr 0x00000008 -#define AOFF_task_real_timer 0x00000208 +#define AOFF_task_real_timer 0x00000138 #define ASIZ_task_real_timer 0x00000028 -#define AOFF_task_times 0x00000230 +#define AOFF_task_times 0x00000160 #define ASIZ_task_times 0x00000020 -#define AOFF_task_start_time 0x00000250 +#define AOFF_task_start_time 0x00000180 #define ASIZ_task_start_time 0x00000008 -#define AOFF_task_per_cpu_utime 0x00000258 +#define AOFF_task_per_cpu_utime 0x00000188 #define ASIZ_task_per_cpu_utime 0x00000100 -#define AOFF_task_min_flt 0x00000458 +#define AOFF_task_min_flt 0x00000388 #define ASIZ_task_min_flt 0x00000008 -#define AOFF_task_maj_flt 0x00000460 +#define AOFF_task_maj_flt 0x00000390 #define ASIZ_task_maj_flt 0x00000008 -#define AOFF_task_nswap 0x00000468 +#define AOFF_task_nswap 0x00000398 #define ASIZ_task_nswap 0x00000008 -#define AOFF_task_cmin_flt 0x00000470 +#define AOFF_task_cmin_flt 0x000003a0 #define ASIZ_task_cmin_flt 0x00000008 -#define AOFF_task_cmaj_flt 0x00000478 +#define AOFF_task_cmaj_flt 0x000003a8 #define ASIZ_task_cmaj_flt 0x00000008 -#define AOFF_task_cnswap 0x00000480 +#define AOFF_task_cnswap 0x000003b0 #define ASIZ_task_cnswap 0x00000008 -#define AOFF_task_swap_address 0x00000490 +#define AOFF_task_swap_address 0x000003c0 #define ASIZ_task_swap_address 0x00000008 -#define AOFF_task_old_maj_flt 0x00000498 +#define AOFF_task_old_maj_flt 0x000003c8 #define ASIZ_task_old_maj_flt 0x00000008 -#define AOFF_task_dec_flt 0x000004a0 +#define AOFF_task_dec_flt 0x000003d0 #define ASIZ_task_dec_flt 0x00000008 -#define AOFF_task_swap_cnt 0x000004a8 +#define AOFF_task_swap_cnt 0x000003d8 #define ASIZ_task_swap_cnt 0x00000008 -#define AOFF_task_rlim 0x000004b0 +#define AOFF_task_uid 0x000003e0 +#define ASIZ_task_uid 0x00000004 +#define AOFF_task_euid 0x000003e4 +#define ASIZ_task_euid 0x00000004 +#define AOFF_task_suid 0x000003e8 +#define ASIZ_task_suid 0x00000004 +#define AOFF_task_fsuid 0x000003ec +#define ASIZ_task_fsuid 0x00000004 +#define AOFF_task_gid 0x000003f0 +#define ASIZ_task_gid 0x00000004 +#define AOFF_task_egid 0x000003f4 +#define ASIZ_task_egid 0x00000004 +#define AOFF_task_sgid 0x000003f8 +#define ASIZ_task_sgid 0x00000004 +#define AOFF_task_fsgid 0x000003fc +#define ASIZ_task_fsgid 0x00000004 +#define AOFF_task_ngroups 0x00000400 +#define ASIZ_task_ngroups 0x00000004 +#define AOFF_task_groups 0x00000404 +#define ASIZ_task_groups 0x00000080 +#define AOFF_task_cap_effective 0x00000484 +#define ASIZ_task_cap_effective 0x00000004 +#define AOFF_task_cap_inheritable 0x00000488 +#define ASIZ_task_cap_inheritable 0x00000004 +#define AOFF_task_cap_permitted 0x0000048c +#define ASIZ_task_cap_permitted 0x00000004 +#define AOFF_task_rlim 0x00000490 #define ASIZ_task_rlim 0x000000a0 -#define AOFF_task_used_math 0x00000550 +#define AOFF_task_used_math 0x00000530 #define ASIZ_task_used_math 0x00000002 -#define AOFF_task_io_usage 0x00000558 -#define ASIZ_task_io_usage 0x00000008 -#define AOFF_task_comm 0x00000560 +#define AOFF_task_comm 0x00000532 #define ASIZ_task_comm 0x00000010 -#define AOFF_task_link_count 0x00000570 +#define AOFF_task_link_count 0x00000544 #define ASIZ_task_link_count 0x00000004 -#define AOFF_task_tty 0x00000578 +#define AOFF_task_tty 0x00000548 #define ASIZ_task_tty 0x00000008 -#define AOFF_task_semundo 0x00000580 +#define AOFF_task_semundo 0x00000550 #define ASIZ_task_semundo 0x00000008 -#define AOFF_task_semsleeping 0x00000588 +#define AOFF_task_semsleeping 0x00000558 #define ASIZ_task_semsleeping 0x00000008 -#define AOFF_task_ldt 0x00000590 -#define ASIZ_task_ldt 0x00000008 -#define AOFF_task_tss 0x000005a0 -#define ASIZ_task_tss 0x00000490 -#define AOFF_task_fs 0x00000a30 +#define AOFF_task_tss 0x00000560 +#define ASIZ_task_tss 0x00000440 +#define AOFF_task_fs 0x000009a0 #define ASIZ_task_fs 0x00000008 -#define AOFF_task_files 0x00000a38 +#define AOFF_task_files 0x000009a8 #define ASIZ_task_files 0x00000008 -#define AOFF_task_mm 0x00000a40 +#define AOFF_task_mm 0x000009b0 #define ASIZ_task_mm 0x00000008 -#define AOFF_task_sig 0x00000a48 +#define AOFF_task_sigmask_lock 0x000009b8 +#define ASIZ_task_sigmask_lock 0x00000001 +#define AOFF_task_sig 0x000009c0 #define ASIZ_task_sig 0x00000008 -#define AOFF_task_signal 0x00000a50 +#define AOFF_task_signal 0x000009c8 #define ASIZ_task_signal 0x00000008 -#define AOFF_task_blocked 0x00000a58 +#define AOFF_task_blocked 0x000009d0 #define ASIZ_task_blocked 0x00000008 -#define AOFF_task_sigqueue 0x00000a60 +#define AOFF_task_sigqueue 0x000009d8 #define ASIZ_task_sigqueue 0x00000008 -#define AOFF_task_sigqueue_tail 0x00000a68 +#define AOFF_task_sigqueue_tail 0x000009e0 #define ASIZ_task_sigqueue_tail 0x00000008 -#define AOFF_task_has_cpu 0x00000a70 -#define ASIZ_task_has_cpu 0x00000004 -#define AOFF_task_processor 0x00000a74 -#define ASIZ_task_processor 0x00000004 -#define AOFF_task_last_processor 0x00000a78 -#define ASIZ_task_last_processor 0x00000004 -#define AOFF_task_lock_depth 0x00000a7c -#define ASIZ_task_lock_depth 0x00000004 -#define AOFF_task_sigmask_lock 0x00000a80 -#define ASIZ_task_sigmask_lock 0x00000001 +#define AOFF_task_sas_ss_sp 0x000009e8 +#define ASIZ_task_sas_ss_sp 0x00000008 +#define AOFF_task_sas_ss_size 0x000009f0 +#define ASIZ_task_sas_ss_size 0x00000008 #define AOFF_mm_mmap 0x00000000 #define ASIZ_mm_mmap 0x00000008 #define AOFF_mm_mmap_cache 0x00000008 @@ -479,22 +499,24 @@ #define ASIZ_mm_def_flags 0x00000008 #define AOFF_mm_cpu_vm_mask 0x000000b0 #define ASIZ_mm_cpu_vm_mask 0x00000008 +#define AOFF_mm_segments 0x000000b8 +#define ASIZ_mm_segments 0x00000008 #define AOFF_thread_ksp 0x00000000 #define ASIZ_thread_ksp 0x00000008 -#define AOFF_thread_kpc 0x00000008 -#define ASIZ_thread_kpc 0x00000004 -#define AOFF_thread_wstate 0x0000000c +#define AOFF_thread_wstate 0x00000008 #define ASIZ_thread_wstate 0x00000002 -#define AOFF_thread_cwp 0x0000000e +#define AOFF_thread_cwp 0x0000000a #define ASIZ_thread_cwp 0x00000002 -#define AOFF_thread_flags 0x00000010 +#define AOFF_thread_flags 0x0000000c #define ASIZ_thread_flags 0x00000002 -#define AOFF_thread_ctx 0x00000012 +#define AOFF_thread_ctx 0x0000000e #define ASIZ_thread_ctx 0x00000002 -#define AOFF_thread_w_saved 0x00000014 +#define AOFF_thread_w_saved 0x00000010 #define ASIZ_thread_w_saved 0x00000002 -#define AOFF_thread_new_signal 0x00000016 +#define AOFF_thread_new_signal 0x00000012 #define ASIZ_thread_new_signal 0x00000002 +#define AOFF_thread____pad 0x00000014 +#define ASIZ_thread____pad 0x00000004 #define AOFF_thread_current_ds 0x00000018 #define ASIZ_thread_current_ds 0x00000008 #define AOFF_thread_kregs 0x00000020 @@ -502,15 +524,21 @@ #define AOFF_thread_utraps 0x00000028 #define ASIZ_thread_utraps 0x00000008 #define AOFF_thread_reg_window 0x00000030 -#define ASIZ_thread_reg_window 0x00000400 -#define AOFF_thread_rwbuf_stkptrs 0x00000430 -#define ASIZ_thread_rwbuf_stkptrs 0x00000040 -#define AOFF_thread_sig_address 0x00000470 +#define ASIZ_thread_reg_window 0x00000380 +#define AOFF_thread_rwbuf_stkptrs 0x000003b0 +#define ASIZ_thread_rwbuf_stkptrs 0x00000038 +#define AOFF_thread_sig_address 0x000003e8 #define ASIZ_thread_sig_address 0x00000008 -#define AOFF_thread_sig_desc 0x00000478 +#define AOFF_thread_sig_desc 0x000003f0 #define ASIZ_thread_sig_desc 0x00000008 -#define AOFF_thread_sstk_info 0x00000480 -#define ASIZ_thread_sstk_info 0x00000010 +#define AOFF_thread_fpdepth 0x000003f8 +#define ASIZ_thread_fpdepth 0x00000001 +#define AOFF_thread_fpsaved 0x000003f9 +#define ASIZ_thread_fpsaved 0x00000007 +#define AOFF_thread_gsr 0x00000400 +#define ASIZ_thread_gsr 0x00000007 +#define AOFF_thread_xfsr 0x00000408 +#define ASIZ_thread_xfsr 0x00000038 #endif /* __SMP__ */ diff --git a/include/asm-sparc64/audioio.h b/include/asm-sparc64/audioio.h new file mode 100644 index 000000000..8d3000ea9 --- /dev/null +++ b/include/asm-sparc64/audioio.h @@ -0,0 +1,416 @@ +/* + * include/asm-sparc/audioio.h + * + * Sparc Audio Midlayer + * Copyright (C) 1996 Thomas K. Dyas (tdyas@noc.rutgers.edu) + */ + +#ifndef _AUDIOIO_H_ +#define _AUDIOIO_H_ + +/* + * SunOS/Solaris /dev/audio interface + */ + +#if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) +#include <linux/types.h> +#include <linux/time.h> +#include <linux/ioctl.h> +#endif + +/* + * This structure contains state information for audio device IO streams. + */ +typedef struct audio_prinfo { + /* + * The following values describe the audio data encoding. + */ + unsigned int sample_rate; /* samples per second */ + unsigned int channels; /* number of interleaved channels */ + unsigned int precision; /* bit-width of each sample */ + unsigned int encoding; /* data encoding method */ + + /* + * The following values control audio device configuration + */ + unsigned int gain; /* gain level: 0 - 255 */ + unsigned int port; /* selected I/O port (see below) */ + unsigned int avail_ports; /* available I/O ports (see below) */ + unsigned int _xxx[2]; /* Reserved for future use */ + + unsigned int buffer_size; /* I/O buffer size */ + + /* + * The following values describe driver state + */ + unsigned int samples; /* number of samples converted */ + unsigned int eof; /* End Of File counter (play only) */ + + unsigned char pause; /* non-zero for pause, zero to resume */ + unsigned char error; /* non-zero if overflow/underflow */ + unsigned char waiting; /* non-zero if a process wants access */ + unsigned char balance; /* stereo channel balance */ + + unsigned short minordev; + + /* + * The following values are read-only state flags + */ + unsigned char open; /* non-zero if open access permitted */ + unsigned char active; /* non-zero if I/O is active */ +} audio_prinfo_t; + + +/* + * This structure describes the current state of the audio device. + */ +typedef struct audio_info { + /* + * Per-stream information + */ + audio_prinfo_t play; /* output status information */ + audio_prinfo_t record; /* input status information */ + + /* + * Per-unit/channel information + */ + unsigned int monitor_gain; /* input to output mix: 0 - 255 */ + unsigned char output_muted; /* non-zero if output is muted */ + unsigned char _xxx[3]; /* Reserved for future use */ + unsigned int _yyy[3]; /* Reserved for future use */ +} audio_info_t; + + +/* + * Audio encoding types + */ +#define AUDIO_ENCODING_NONE (0) /* no encoding assigned */ +#define AUDIO_ENCODING_ULAW (1) /* u-law encoding */ +#define AUDIO_ENCODING_ALAW (2) /* A-law encoding */ +#define AUDIO_ENCODING_LINEAR (3) /* Linear PCM encoding */ +#define AUDIO_ENCODING_DVI (104) /* DVI ADPCM */ +#define AUDIO_ENCODING_LINEAR8 (105) /* 8 bit UNSIGNED */ +#define AUDIO_ENCODING_LINEARLE (106) /* Linear PCM LE encoding */ + +/* + * These ranges apply to record, play, and monitor gain values + */ +#define AUDIO_MIN_GAIN (0) /* minimum gain value */ +#define AUDIO_MAX_GAIN (255) /* maximum gain value */ + +/* + * These values apply to the balance field to adjust channel gain values + */ +#define AUDIO_LEFT_BALANCE (0) /* left channel only */ +#define AUDIO_MID_BALANCE (32) /* equal left/right channel */ +#define AUDIO_RIGHT_BALANCE (64) /* right channel only */ +#define AUDIO_BALANCE_SHIFT (3) + +/* + * Generic minimum/maximum limits for number of channels, both modes + */ +#define AUDIO_MIN_PLAY_CHANNELS (1) +#define AUDIO_MAX_PLAY_CHANNELS (4) +#define AUDIO_MIN_REC_CHANNELS (1) +#define AUDIO_MAX_REC_CHANNELS (4) + +/* + * Generic minimum/maximum limits for sample precision + */ +#define AUDIO_MIN_PLAY_PRECISION (8) +#define AUDIO_MAX_PLAY_PRECISION (32) +#define AUDIO_MIN_REC_PRECISION (8) +#define AUDIO_MAX_REC_PRECISION (32) + +/* + * Define some convenient names for typical audio ports + */ +/* + * output ports (several may be enabled simultaneously) + */ +#define AUDIO_SPEAKER 0x01 /* output to built-in speaker */ +#define AUDIO_HEADPHONE 0x02 /* output to headphone jack */ +#define AUDIO_LINE_OUT 0x04 /* output to line out */ + +/* + * input ports (usually only one at a time) + */ +#define AUDIO_MICROPHONE 0x01 /* input from microphone */ +#define AUDIO_LINE_IN 0x02 /* input from line in */ +#define AUDIO_CD 0x04 /* input from on-board CD inputs */ +#define AUDIO_INTERNAL_CD_IN AUDIO_CD /* input from internal CDROM */ +/* Supposedly an undocumented feature of the 4231 */ +#define AUDIO_ANALOG_LOOPBACK 0x40 + + +/* + * This macro initializes an audio_info structure to 'harmless' values. + * Note that (~0) might not be a harmless value for a flag that was + * a signed int. + */ +#define AUDIO_INITINFO(i) { \ + unsigned int *__x__; \ + for (__x__ = (unsigned int *)(i); \ + (char *) __x__ < (((char *)(i)) + sizeof (audio_info_t)); \ + *__x__++ = ~0); \ +} + +/* + * These allow testing for what the user wants to set + */ +#define AUD_INITVALUE (~0) +#define Modify(X) ((unsigned int)(X) != AUD_INITVALUE) +#define Modifys(X) ((X) != (unsigned short)AUD_INITVALUE) +#define Modifyc(X) ((X) != (unsigned char)AUD_INITVALUE) + +/* + * Parameter for the AUDIO_GETDEV ioctl to determine current + * audio devices. + */ +#define MAX_AUDIO_DEV_LEN (16) +typedef struct audio_device { + char name[MAX_AUDIO_DEV_LEN]; + char version[MAX_AUDIO_DEV_LEN]; + char config[MAX_AUDIO_DEV_LEN]; +} audio_device_t; + + +/* + * Ioctl calls for the audio device. + */ + +/* + * AUDIO_GETINFO retrieves the current state of the audio device. + * + * AUDIO_SETINFO copies all fields of the audio_info structure whose + * values are not set to the initialized value (-1) to the device state. + * It performs an implicit AUDIO_GETINFO to return the new state of the + * device. Note that the record.samples and play.samples fields are set + * to the last value before the AUDIO_SETINFO took effect. This allows + * an application to reset the counters while atomically retrieving the + * last value. + * + * AUDIO_DRAIN suspends the calling process until the write buffers are + * empty. + * + * AUDIO_GETDEV returns a structure of type audio_device_t which contains + * three strings. The string "name" is a short identifying string (for + * example, the SBus Fcode name string), the string "version" identifies + * the current version of the device, and the "config" string identifies + * the specific configuration of the audio stream. All fields are + * device-dependent -- see the device specific manual pages for details. + * + * AUDIO_GETDEV_SUNOS returns a number which is an audio device defined + * herein (making it not too portable) + * + * AUDIO_FLUSH stops all playback and recording, clears all queued buffers, + * resets error counters, and restarts recording and playback as appropriate + * for the current sampling mode. + */ +#define AUDIO_GETINFO _IOR('A', 1, audio_info_t) +#define AUDIO_SETINFO _IOWR('A', 2, audio_info_t) +#define AUDIO_DRAIN _IO('A', 3) +#define AUDIO_GETDEV _IOR('A', 4, audio_device_t) +#define AUDIO_GETDEV_SUNOS _IOR('A', 4, int) +#define AUDIO_FLUSH _IO('A', 5) + +/* Define possible audio hardware configurations for + * old SunOS-style AUDIO_GETDEV ioctl */ +#define AUDIO_DEV_UNKNOWN (0) /* not defined */ +#define AUDIO_DEV_AMD (1) /* audioamd device */ +#define AUDIO_DEV_SPEAKERBOX (2) /* dbri device with speakerbox */ +#define AUDIO_DEV_CODEC (3) /* dbri device (internal speaker) */ +#define AUDIO_DEV_CS4231 (5) /* cs4231 device */ + +/* + * The following ioctl sets the audio device into an internal loopback mode, + * if the hardware supports this. The argument is TRUE to set loopback, + * FALSE to reset to normal operation. If the hardware does not support + * internal loopback, the ioctl should fail with EINVAL. + */ +#define AUDIO_DIAG_LOOPBACK _IOW('A', 101, int) + +#ifdef notneeded +/* + * Structure sent up as a M_PROTO message on trace streams + */ +typedef struct audtrace_hdr audtrace_hdr_t; +struct audtrace_hdr { + unsigned int seq; /* Sequence number (per-aud_stream) */ + int type; /* device-dependent */ + struct timeval timestamp; + char _f[8]; /* filler */ +}; +#endif + +/* + * Linux kernel internal implementation. + */ + +#ifdef __KERNEL__ + +#include <linux/types.h> +#include <linux/fs.h> +#include <linux/tqueue.h> +#include <linux/wait.h> + +#define SDF_OPEN_WRITE 0x00000001 +#define SDF_OPEN_READ 0x00000002 + +struct sparcaudio_driver +{ + const char * name; + struct sparcaudio_operations *ops; + void *private; + unsigned long flags; + + /* This device */ + struct linux_sbus_device *dev; + + /* Processes blocked on open() sit here. */ + struct wait_queue *open_wait; + + /* Task queue for this driver's bottom half. */ + struct tq_struct tqueue; + + /* Support for a circular queue of output buffers. */ + __u8 **output_buffers; + size_t *output_sizes, output_size; + int num_output_buffers, output_front, output_rear; + int output_count, output_active, playing_count; + struct wait_queue *output_write_wait, *output_drain_wait; + + /* Support for a circular queue of input buffers. */ + __u8 **input_buffers; + int input_offset; + int num_input_buffers, input_front, input_rear; + int input_count, input_active, recording_count; + struct wait_queue *input_read_wait; +}; + +struct sparcaudio_operations +{ + int (*open)(struct inode *, struct file *, struct sparcaudio_driver *); + void (*release)(struct inode *, struct file *, + struct sparcaudio_driver *); + int (*ioctl)(struct inode *, struct file *, unsigned int, + unsigned long, struct sparcaudio_driver *); + + /* Ask driver to begin playing a buffer. */ + void (*start_output)(struct sparcaudio_driver *, __u8 *, + unsigned long); + + /* Ask driver to stop playing a buffer. */ + void (*stop_output)(struct sparcaudio_driver *); + + /* Ask driver to begin recording into a buffer. */ + void (*start_input)(struct sparcaudio_driver *, __u8 *, unsigned long); + + /* Ask driver to stop recording. */ + void (*stop_input)(struct sparcaudio_driver *); + + /* Return driver name/version to caller. (/dev/audio specific) */ + void (*sunaudio_getdev)(struct sparcaudio_driver *, audio_device_t *); + + /* Get and set the output volume. (0-255) */ + int (*set_output_volume)(struct sparcaudio_driver *, int); + int (*get_output_volume)(struct sparcaudio_driver *); + + /* Get and set the input volume. (0-255) */ + int (*set_input_volume)(struct sparcaudio_driver *, int); + int (*get_input_volume)(struct sparcaudio_driver *); + + /* Get and set the monitor volume. (0-255) */ + int (*set_monitor_volume)(struct sparcaudio_driver *, int); + int (*get_monitor_volume)(struct sparcaudio_driver *); + + /* Get and set the output balance. (0-64) */ + int (*set_output_balance)(struct sparcaudio_driver *, int); + int (*get_output_balance)(struct sparcaudio_driver *); + + /* Get and set the input balance. (0-64) */ + int (*set_input_balance)(struct sparcaudio_driver *, int); + int (*get_input_balance)(struct sparcaudio_driver *); + + /* Get and set the output channels. (1-4) */ + int (*set_output_channels)(struct sparcaudio_driver *, int); + int (*get_output_channels)(struct sparcaudio_driver *); + + /* Get and set the input channels. (1-4) */ + int (*set_input_channels)(struct sparcaudio_driver *, int); + int (*get_input_channels)(struct sparcaudio_driver *); + + /* Get and set the output precision. (8-32) */ + int (*set_output_precision)(struct sparcaudio_driver *, int); + int (*get_output_precision)(struct sparcaudio_driver *); + + /* Get and set the input precision. (8-32) */ + int (*set_input_precision)(struct sparcaudio_driver *, int); + int (*get_input_precision)(struct sparcaudio_driver *); + + /* Get and set the output port. () */ + int (*set_output_port)(struct sparcaudio_driver *, int); + int (*get_output_port)(struct sparcaudio_driver *); + + /* Get and set the input port. () */ + int (*set_input_port)(struct sparcaudio_driver *, int); + int (*get_input_port)(struct sparcaudio_driver *); + + /* Get and set the output encoding. () */ + int (*set_output_encoding)(struct sparcaudio_driver *, int); + int (*get_output_encoding)(struct sparcaudio_driver *); + + /* Get and set the input encoding. () */ + int (*set_input_encoding)(struct sparcaudio_driver *, int); + int (*get_input_encoding)(struct sparcaudio_driver *); + + /* Get and set the output rate. () */ + int (*set_output_rate)(struct sparcaudio_driver *, int); + int (*get_output_rate)(struct sparcaudio_driver *); + + /* Get and set the input rate. () */ + int (*set_input_rate)(struct sparcaudio_driver *, int); + int (*get_input_rate)(struct sparcaudio_driver *); + + /* Return driver number to caller. (SunOS /dev/audio specific) */ + int (*sunaudio_getdev_sunos)(struct sparcaudio_driver *); + + /* Get available ports */ + int (*get_output_ports)(struct sparcaudio_driver *); + int (*get_input_ports)(struct sparcaudio_driver *); + + /* Get and set output mute */ + int (*set_output_muted)(struct sparcaudio_driver *, int); + int (*get_output_muted)(struct sparcaudio_driver *); +}; + +extern int register_sparcaudio_driver(struct sparcaudio_driver *); +extern int unregister_sparcaudio_driver(struct sparcaudio_driver *); +extern void sparcaudio_output_done(struct sparcaudio_driver *, int); +extern void sparcaudio_input_done(struct sparcaudio_driver *); +extern int sparcaudio_init(void); +extern int amd7930_init(void); +extern int cs4231_init(void); + +#endif + +/* Macros to convert between mixer stereo volumes and gain (mono) */ +#define s_to_m(a) (((((a) >> 8) & 0x7f) + ((a) & 0x7f)) / 2) +#define m_to_s(a) (((a) << 8) + (a)) + +/* convert mixer stereo volume to balance */ +#define s_to_b(a) (AUDIO_RIGHT_BALANCE * ((((a) >> 8) & 0xff) / (((((a) >> 8) & 0xff) + ((a) & 0xff)) / 2))) + +/* convert mixer stereo volume to audio gain */ +#define s_to_g(a) (((((a) >> 8) & 0xff) + ((a) & 0xff)) / 2) + +/* convert gain a and balance b to mixer volume */ +#define b_to_s(a,b) ((a * (b / AUDIO_RIGHT_BALANCE) << 8) + (a * (1 - (b / AUDIO_RIGHT_BALANCE)))) + +#define SPARCAUDIO_MIXER_MINOR 0 +#define SPARCAUDIO_DSP16_MINOR 1 +#define SPARCAUDIO_DSP_MINOR 3 +#define SPARCAUDIO_AUDIO_MINOR 4 +#define SPARCAUDIO_AUDIOCTL_MINOR 5 +#define SPARCAUDIO_STATUS_MINOR 6 +#endif diff --git a/include/asm-sparc64/bitops.h b/include/asm-sparc64/bitops.h index e8b600eb0..d355b1ed4 100644 --- a/include/asm-sparc64/bitops.h +++ b/include/asm-sparc64/bitops.h @@ -1,4 +1,4 @@ -/* $Id: bitops.h,v 1.23 1997/12/18 02:44:12 ecd Exp $ +/* $Id: bitops.h,v 1.25 1998/07/26 03:05:51 davem Exp $ * bitops.h: Bit string operations on the V9. * * Copyright 1996, 1997 David S. Miller (davem@caip.rutgers.edu) @@ -186,6 +186,56 @@ extern __inline__ unsigned long ffz(unsigned long word) return result; } +#ifdef __KERNEL__ + +/* + * ffs: find first bit set. This is defined the same way as + * the libc and compiler builtin ffs routines, therefore + * differs in spirit from the above ffz (man ffs). + */ + +#define ffs(x) generic_ffs(x) + +/* + * hweightN: returns the hamming weight (i.e. the number + * of bits set) of a N-bit word + */ + +#ifdef ULTRA_HAS_POPULATION_COUNT + +extern __inline__ unsigned int hweight32(unsigned int w) +{ + unsigned int res; + + __asm__ ("popc %1,%0" : "=r" (res) : "r" (w & 0xffffffff)); + return res; +} + +extern __inline__ unsigned int hweight16(unsigned int w) +{ + unsigned int res; + + __asm__ ("popc %1,%0" : "=r" (res) : "r" (w & 0xffff)); + return res; +} + +extern __inline__ unsigned int hweight8(unsigned int w) +{ + unsigned int res; + + __asm__ ("popc %1,%0" : "=r" (res) : "r" (w & 0xff)); + return res; +} + +#else + +#define hweight32(x) generic_hweight32(x) +#define hweight16(x) generic_hweight16(x) +#define hweight8(x) generic_hweight8(x) + +#endif +#endif /* __KERNEL__ */ + /* find_next_zero_bit() finds the first zero bit in a bit string of length * 'size' bits, starting the search at bit 'offset'. This is largely based * on Linus's ALPHA routines, which are pretty portable BTW. diff --git a/include/asm-sparc64/dma.h b/include/asm-sparc64/dma.h index 4afcd5f27..aedfa7ddd 100644 --- a/include/asm-sparc64/dma.h +++ b/include/asm-sparc64/dma.h @@ -1,4 +1,4 @@ -/* $Id: dma.h,v 1.7 1997/04/10 05:13:28 davem Exp $ +/* $Id: dma.h,v 1.8 1998/04/13 07:27:06 davem Exp $ * include/asm-sparc64/dma.h * * Copyright 1996 (C) David S. Miller (davem@caip.rutgers.edu) @@ -74,7 +74,7 @@ extern struct Linux_SBus_DMA *dma_chain; #define DMA_ISESC1(dma) ((dma)->revision == dvmaesc1) /* Main routines in dma.c */ -extern unsigned long dvma_init(struct linux_sbus *, unsigned long); +extern void dvma_init(struct linux_sbus *); /* Fields in the cond_reg register */ /* First, the version identification bits */ diff --git a/include/asm-sparc64/ebus.h b/include/asm-sparc64/ebus.h index 333f7affe..8724757c7 100644 --- a/include/asm-sparc64/ebus.h +++ b/include/asm-sparc64/ebus.h @@ -1,4 +1,4 @@ -/* $Id: ebus.h,v 1.5 1998/03/15 10:14:46 ecd Exp $ +/* $Id: ebus.h,v 1.8 1998/05/07 21:00:27 ecd Exp $ * ebus.h: PCI to Ebus pseudo driver software state. * * Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be) @@ -82,7 +82,7 @@ struct linux_ebus_dma { extern struct linux_ebus *ebus_chain; -extern unsigned long ebus_init(unsigned long, unsigned long); +extern void ebus_init(void); #define for_each_ebus(bus) \ for((bus) = ebus_chain; (bus); (bus) = (bus)->next) @@ -93,9 +93,4 @@ extern unsigned long ebus_init(unsigned long, unsigned long); #define for_each_edevchild(dev, child) \ for((child) = (dev)->children; (child); (child) = (child)->next) -#define for_all_ebusdev(dev, bus) \ - for ((bus) = ebus_chain, ((dev) = (bus) ? (bus)->devices : 0); \ - (bus); ((dev) = (dev)->next ? (dev)->next : \ - ((bus) = (bus)->next, (bus) ? (bus)->devices : 0))) - #endif /* !(__SPARC64_EBUS_H) */ diff --git a/include/asm-sparc64/envctrl.h b/include/asm-sparc64/envctrl.h new file mode 100644 index 000000000..1b5e4da9c --- /dev/null +++ b/include/asm-sparc64/envctrl.h @@ -0,0 +1,17 @@ +/* $Id: envctrl.h,v 1.1 1998/05/16 17:26:07 ecd Exp $ + * + * envctrl.h: Definitions for access to the i2c environment + * monitoring on Ultrasparc systems. + * + * Copyright (C) 1998 Eddie C. Dost (ecd@skynet.be) + */ + +#ifndef _SPARC64_ENVCTRL_H +#define _SPARC64_ENVCTRL_H 1 + +#include <linux/ioctl.h> + +#define I2CIOCSADR _IOW('p', 0x40, int) +#define I2CIOCGADR _IOR('p', 0x41, int) + +#endif /* !(_SPARC64_ENVCTRL_H) */ diff --git a/include/asm-sparc64/fbio.h b/include/asm-sparc64/fbio.h index c890793ed..6f45ce973 100644 --- a/include/asm-sparc64/fbio.h +++ b/include/asm-sparc64/fbio.h @@ -59,8 +59,13 @@ struct fbcmap { unsigned char *blue; }; +#ifdef __KERNEL__ +#define FBIOPUTCMAP_SPARC _IOW('F', 3, struct fbcmap) +#define FBIOGETCMAP_SPARC _IOW('F', 4, struct fbcmap) +#else #define FBIOPUTCMAP _IOW('F', 3, struct fbcmap) #define FBIOGETCMAP _IOW('F', 4, struct fbcmap) +#endif /* # of device specific values */ #define FB_ATTR_NDEVSPECIFIC 8 diff --git a/include/asm-sparc64/firehose.h b/include/asm-sparc64/firehose.h index e4f4bb7e7..de403e98c 100644 --- a/include/asm-sparc64/firehose.h +++ b/include/asm-sparc64/firehose.h @@ -1,4 +1,4 @@ -/* $Id: firehose.h,v 1.2 1997/08/08 04:26:31 davem Exp $ +/* $Id: firehose.h,v 1.3 1998/06/10 07:28:43 davem Exp $ * firehose.h: Defines for the Fire Hose Controller (FHC) found * on Sunfire/Starfire/Wildfire systems. * @@ -29,7 +29,7 @@ struct fhc_internal_regs { /*0x0100*/ u32 fhc_jtag_cmd; /* FHC JTAG Command Register */ }; -/* Part of same space of regs, but mapped seperately in PROM reg property +/* Part of same space of regs, but mapped separately in PROM reg property * for the FHC, thus we have the following few structs... */ struct fhc_ign_reg { diff --git a/include/asm-sparc64/floppy.h b/include/asm-sparc64/floppy.h index ea5208f85..e90a7aca1 100644 --- a/include/asm-sparc64/floppy.h +++ b/include/asm-sparc64/floppy.h @@ -1,4 +1,4 @@ -/* $Id: floppy.h,v 1.7 1997/09/07 03:34:08 davem Exp $ +/* $Id: floppy.h,v 1.11 1998/05/22 14:33:39 jj Exp $ * asm-sparc64/floppy.h: Sparc specific parts of the Floppy driver. * * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) @@ -11,6 +11,7 @@ #define __ASM_SPARC64_FLOPPY_H #include <linux/config.h> +#include <linux/init.h> #include <asm/page.h> #include <asm/pgtable.h> @@ -39,7 +40,7 @@ struct sun_flpy_controller { #define dcr_82077 dir_82077 /* Config Control reg. */ }; -/* You'll only ever find one controller on a SparcStation anyways. */ +/* You'll only ever find one controller on an Ultra anyways. */ static struct sun_flpy_controller *sun_fdc = NULL; volatile unsigned char *fdc_status; static struct linux_sbus_device *floppy_sdev = NULL; @@ -229,21 +230,10 @@ static int sun_fd_request_irq(void) int error; if(!once) { - struct devid_cookie dcookie; - once = 1; - dcookie.real_dev_id = NULL; - dcookie.imap = dcookie.iclr = 0; - dcookie.pil = -1; - dcookie.bus_cookie = floppy_sdev->my_bus; - - error = request_fast_irq(FLOPPY_IRQ, floppy_hardint, - (SA_INTERRUPT | SA_SBUS | SA_DCOOKIE), - "floppy", &dcookie); - - if(error == 0) - FLOPPY_IRQ = dcookie.ret_ino; + error = request_fast_irq(FLOPPY_IRQ, floppy_hardint, + SA_INTERRUPT, "floppy", NULL); return ((error == 0) ? 0 : -1); } @@ -294,29 +284,45 @@ static void sun_pci_fd_outb(unsigned char val, unsigned long port) outb(val, port); } -static void sun_pci_fd_enable_dma(void) +static void sun_pci_fd_reset_dma(void) { unsigned int dcsr; - dcsr = readl((unsigned long)&sun_fd_ebus_dma->dcsr); - dcsr |= (EBUS_DCSR_EN_DMA | EBUS_DCSR_EN_CNT); + writel(EBUS_DCSR_RESET, &sun_fd_ebus_dma->dcsr); + + dcsr = EBUS_DCSR_BURST_SZ_16 | EBUS_DCSR_TCI_DIS | + EBUS_DCSR_EN_CNT | EBUS_DCSR_INT_EN; writel(dcsr, (unsigned long)&sun_fd_ebus_dma->dcsr); } +static void sun_pci_fd_enable_dma(void) +{ + unsigned int dcsr; + + dcsr = readl(&sun_fd_ebus_dma->dcsr); + dcsr |= EBUS_DCSR_EN_DMA; + writel(dcsr, &sun_fd_ebus_dma->dcsr); +} + static void sun_pci_fd_disable_dma(void) { unsigned int dcsr; - dcsr = readl((unsigned long)&sun_fd_ebus_dma->dcsr); - dcsr &= ~(EBUS_DCSR_EN_DMA | EBUS_DCSR_EN_CNT); - writel(dcsr, (unsigned long)&sun_fd_ebus_dma->dcsr); + dcsr = readl(&sun_fd_ebus_dma->dcsr); + while (dcsr & EBUS_DCSR_DRAIN) + dcsr = readl(&sun_fd_ebus_dma->dcsr); + dcsr &= ~(EBUS_DCSR_EN_DMA); + if (dcsr & EBUS_DCSR_ERR_PEND) + sun_pci_fd_reset_dma(); + writel(dcsr, &sun_fd_ebus_dma->dcsr); } static void sun_pci_fd_set_dma_mode(int mode) { unsigned int dcsr; - dcsr = readl((unsigned long)&sun_fd_ebus_dma->dcsr); + dcsr = readl(&sun_fd_ebus_dma->dcsr); + dcsr |= EBUS_DCSR_EN_CNT | EBUS_DCSR_TC; /* * For EBus WRITE means to system memory, which is * READ for us. @@ -325,61 +331,61 @@ static void sun_pci_fd_set_dma_mode(int mode) dcsr &= ~(EBUS_DCSR_WRITE); else dcsr |= EBUS_DCSR_WRITE; - writel(dcsr, (unsigned long)&sun_fd_ebus_dma->dcsr); + writel(dcsr, &sun_fd_ebus_dma->dcsr); } static void sun_pci_fd_set_dma_count(int length) { - writel(length, (unsigned long)&sun_fd_ebus_dma->dbcr); + writel(length, &sun_fd_ebus_dma->dbcr); } static void sun_pci_fd_set_dma_addr(char *buffer) { - unsigned int addr; + unsigned int addr = virt_to_bus(buffer); + writel(addr, &sun_fd_ebus_dma->dacr); +} - addr = virt_to_bus(buffer); - writel(addr, (unsigned long)&sun_fd_ebus_dma->dacr); +static unsigned int sun_pci_get_dma_residue(void) +{ + return readl(&sun_fd_ebus_dma->dbcr); } static void sun_pci_fd_enable_irq(void) { unsigned int dcsr; - dcsr = readl((unsigned long)&sun_fd_ebus_dma->dcsr); + dcsr = readl(&sun_fd_ebus_dma->dcsr); dcsr |= EBUS_DCSR_INT_EN; - writel(dcsr, (unsigned long)&sun_fd_ebus_dma->dcsr); + writel(dcsr, &sun_fd_ebus_dma->dcsr); } static void sun_pci_fd_disable_irq(void) { unsigned int dcsr; - dcsr = readl((unsigned long)&sun_fd_ebus_dma->dcsr); + dcsr = readl(&sun_fd_ebus_dma->dcsr); dcsr &= ~(EBUS_DCSR_INT_EN); - writel(dcsr, (unsigned long)&sun_fd_ebus_dma->dcsr); + writel(dcsr, &sun_fd_ebus_dma->dcsr); } static int sun_pci_fd_request_irq(void) { - int error; + int err; - error = request_irq(FLOPPY_IRQ, floppy_interrupt, SA_SHIRQ, "floppy", sun_fdc); - return ((error == 0) ? 0 : -1); + err = request_irq(FLOPPY_IRQ, floppy_interrupt, SA_SHIRQ, + "floppy", sun_fdc); + if (err) + return -1; + sun_pci_fd_enable_irq(); + return 0; } static void sun_pci_fd_free_irq(void) { + sun_pci_fd_disable_irq(); free_irq(FLOPPY_IRQ, sun_fdc); } -static unsigned int sun_pci_get_dma_residue(void) -{ - unsigned int res; - - res = readl((unsigned long)&sun_fd_ebus_dma->dbcr); - return res; -} - static int sun_pci_fd_eject(int drive) { return -EINVAL; @@ -388,7 +394,7 @@ static int sun_pci_fd_eject(int drive) static struct linux_prom_registers fd_regs[2]; -static unsigned long sun_floppy_init(void) +__initfunc(static unsigned long sun_floppy_init(void)) { char state[128]; int fd_node, num_regs; @@ -401,19 +407,26 @@ static unsigned long sun_floppy_init(void) } if(sdev) { floppy_sdev = sdev; - FLOPPY_IRQ = sdev->irqs[0].pri; + FLOPPY_IRQ = sdev->irqs[0]; } else { #ifdef CONFIG_PCI struct linux_ebus *ebus; - struct linux_ebus_device *edev; + struct linux_ebus_device *edev = 0; - for_all_ebusdev(edev, ebus) { - if (!strcmp(edev->prom_name, "fdthree")) - break; + for_each_ebus(ebus) { + for_each_ebusdev(edev, ebus) { + if (!strcmp(edev->prom_name, "fdthree")) + goto ebus_done; + } } + ebus_done: if (!edev) return -1; + prom_getproperty(edev->prom_node, "status", state, sizeof(state)); + if(!strncmp(state, "disabled", 8)) + return -1; + if (check_region(edev->base_address[1], sizeof(struct linux_ebus_dma))) { printk("sun_floppy_init: can't get region %016lx (%d)\n", edev->base_address[1], (int)sizeof(struct linux_ebus_dma)); @@ -425,7 +438,7 @@ static unsigned long sun_floppy_init(void) FLOPPY_IRQ = edev->irqs[0]; sun_fd_ebus_dma = (struct linux_ebus_dma *)edev->base_address[1]; - writel(EBUS_DCSR_BURST_SZ_16, (unsigned long)&sun_fd_ebus_dma->dcsr); + sun_pci_fd_reset_dma(); sun_fdops.fd_inb = sun_pci_fd_inb; sun_fdops.fd_outb = sun_pci_fd_outb; @@ -460,12 +473,11 @@ static unsigned long sun_floppy_init(void) num_regs = prom_getproperty(fd_node, "reg", (char *) fd_regs, sizeof(fd_regs)); num_regs = (num_regs / sizeof(fd_regs[0])); prom_apply_sbus_ranges(sdev->my_bus, fd_regs, num_regs, sdev); - sun_fdc = (struct sun_flpy_controller *) sparc_alloc_io(fd_regs[0].phys_addr, - 0x0, - fd_regs[0].reg_size, - "floppy", - fd_regs[0].which_io, - 0x0); + /* We cannot do sparc_alloc_io here: it does request_region, which is the generic + floppy driver trying to do once again */ + sun_fdc = (struct sun_flpy_controller *) (PAGE_OFFSET + fd_regs[0].phys_addr + + (((unsigned long)fd_regs[0].which_io) << 32)); + /* Last minute sanity check... */ if(sun_fdc->status1_82077 == 0xff) { sun_fdc = NULL; diff --git a/include/asm-sparc64/fpumacro.h b/include/asm-sparc64/fpumacro.h index 91b9b81f8..9fd631670 100644 --- a/include/asm-sparc64/fpumacro.h +++ b/include/asm-sparc64/fpumacro.h @@ -8,14 +8,13 @@ #define _SPARC64_FPUMACRO_H #include <asm/asi.h> +#include <asm/visasm.h> struct fpustate { u32 regs[64]; - u64 fsr; - u64 gsr; }; -#define FPUSTATE (struct fpustate *)(((unsigned long)current) + (((PAGE_SIZE<<1)-((64*4)+(2*8))) & ~(64 - 1))) +#define FPUSTATE (struct fpustate *)(((unsigned long)current) + AOFF_task_fpregs) extern __inline__ unsigned long fprs_read(void) { diff --git a/include/asm-sparc64/ide.h b/include/asm-sparc64/ide.h index acd593303..8ac583281 100644 --- a/include/asm-sparc64/ide.h +++ b/include/asm-sparc64/ide.h @@ -1,4 +1,4 @@ -/* $Id: ide.h,v 1.6 1998/03/15 13:29:13 ecd Exp $ +/* $Id: ide.h,v 1.9 1998/05/08 21:05:28 davem Exp $ * ide.h: Ultra/PCI specific IDE glue. * * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu) @@ -97,24 +97,43 @@ static __inline__ int ide_ack_intr(ide_ioreg_t status_port, ide_ioreg_t irq_port /* From m68k code... */ +#ifdef insl +#undef insl +#endif +#ifdef outsl +#undef outsl +#endif +#ifdef insw +#undef insw +#endif +#ifdef outsw +#undef outsw +#endif + #define insl(data_reg, buffer, wcount) insw(data_reg, buffer, (wcount)<<1) #define outsl(data_reg, buffer, wcount) outsw(data_reg, buffer, (wcount)<<1) #define insw(port, buf, nr) ide_insw((port), (buf), (nr)) #define outsw(port, buf, nr) ide_outsw((port), (buf), (nr)) +/* We need to use L1 cache bypassing to prevent dcache alias + * inconsistencies with user space. -DaveM + */ static __inline__ void ide_insw(unsigned long port, void *dst, unsigned long count) { volatile unsigned short *data_port; - u16 *ps = dst; + u16 *ps = (u16 *)__pa(dst); u32 *pi; data_port = (volatile unsigned short *)port; if(((u64)ps) & 0x2) { - *ps++ = *data_port; + __asm__ __volatile__("stha %0, [%1] %2" + : /* no outputs */ + : "r" (*data_port), "r" (ps++), + "i" (ASI_PHYS_USE_EC)); count--; } pi = (u32 *)ps; @@ -123,12 +142,18 @@ static __inline__ void ide_insw(unsigned long port, w = (*data_port) << 16; w |= (*data_port); - *pi++ = w; + __asm__ __volatile__("stwa %0, [%1] %2" + : /* no outputs */ + : "r" (w), "r" (pi++), + "i" (ASI_PHYS_USE_EC)); count -= 2; } ps = (u16 *)pi; if(count) - *ps = *data_port; + __asm__ __volatile__("stha %0, [%1] %2" + : /* no outputs */ + : "r" (*data_port), "r" (ps), + "i" (ASI_PHYS_USE_EC)); } static __inline__ void ide_outsw(unsigned long port, @@ -136,27 +161,37 @@ static __inline__ void ide_outsw(unsigned long port, unsigned long count) { volatile unsigned short *data_port; - const u16 *ps = src; + const u16 *ps = (const u16 *)__pa(src); const u32 *pi; data_port = (volatile unsigned short *)port; if(((u64)src) & 0x2) { - *data_port = *ps++; + u16 w; + __asm__ __volatile__("lduha [%1] %2, %0" + : "=r" (w) + : "r" (ps++), "i" (ASI_PHYS_USE_EC)); + *data_port = w; count--; } pi = (const u32 *)ps; while(count >= 2) { u32 w; - - w = *pi++; + __asm__ __volatile__("lduwa [%1] %2, %0" + : "=r" (w) + : "r" (pi++), "i" (ASI_PHYS_USE_EC)); *data_port = (w >> 16); *data_port = w; count -= 2; } ps = (const u16 *)pi; - if(count) - *data_port = *ps; + if(count) { + u16 w; + __asm__ __volatile__("lduha [%1] %2, %0" + : "=r" (w) + : "r" (ps++), "i" (ASI_PHYS_USE_EC)); + *data_port = w; + } } #define T_CHAR (0x0000) /* char: don't touch */ diff --git a/include/asm-sparc64/io.h b/include/asm-sparc64/io.h index 3b8502189..a6bdff9a3 100644 --- a/include/asm-sparc64/io.h +++ b/include/asm-sparc64/io.h @@ -1,4 +1,4 @@ -/* $Id: io.h,v 1.16 1998/03/24 05:54:40 ecd Exp $ */ +/* $Id: io.h,v 1.18 1998/07/12 12:07:43 ecd Exp $ */ #ifndef __SPARC64_IO_H #define __SPARC64_IO_H @@ -13,27 +13,48 @@ #define __SLOW_DOWN_IO do { } while (0) #define SLOW_DOWN_IO do { } while (0) + +#define PCI_DVMA_HASHSZ 256 + extern unsigned long pci_dvma_offset; extern unsigned long pci_dvma_mask; +extern unsigned long pci_dvma_v2p_hash[PCI_DVMA_HASHSZ]; +extern unsigned long pci_dvma_p2v_hash[PCI_DVMA_HASHSZ]; + +#define pci_dvma_ahashfn(addr) (((addr) >> 24) & 0xff) + extern __inline__ unsigned long virt_to_phys(volatile void *addr) { unsigned long vaddr = (unsigned long)addr; + unsigned long off; /* Handle kernel variable pointers... */ if (vaddr < PAGE_OFFSET) vaddr += PAGE_OFFSET - (unsigned long)&empty_zero_page; - return ((vaddr - PAGE_OFFSET) | pci_dvma_offset); + + off = pci_dvma_v2p_hash[pci_dvma_ahashfn(vaddr - PAGE_OFFSET)]; + return vaddr + off; } extern __inline__ void *phys_to_virt(unsigned long addr) { - return ((void *)((addr & pci_dvma_mask) + PAGE_OFFSET)); + unsigned long paddr = addr & 0xffffffffUL; + unsigned long off; + + off = pci_dvma_p2v_hash[pci_dvma_ahashfn(paddr)]; + return (void *)(paddr + off); } #define virt_to_bus virt_to_phys #define bus_to_virt phys_to_virt +extern __inline__ unsigned long bus_dvma_to_mem(unsigned long vaddr) +{ + return vaddr & pci_dvma_mask; +} + + extern __inline__ unsigned int inb(unsigned long addr) { unsigned int ret; diff --git a/include/asm-sparc64/irq.h b/include/asm-sparc64/irq.h index b7e6f2d23..b9a900406 100644 --- a/include/asm-sparc64/irq.h +++ b/include/asm-sparc64/irq.h @@ -1,39 +1,39 @@ -/* $Id: irq.h,v 1.8 1998/03/15 17:23:51 ecd Exp $ +/* $Id: irq.h,v 1.10 1998/05/29 06:00:39 ecd Exp $ * irq.h: IRQ registers on the 64-bit Sparc. * * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) + * Copyright (C) 1998 Jakub Jelinek (jj@ultra.linux.cz) */ #ifndef _SPARC64_IRQ_H #define _SPARC64_IRQ_H #include <linux/linkage.h> - -/* Sparc64 extensions to the interrupt registry flags. Mostly this is - * for passing along what bus type the device is on and also the true - * format of the dev_id cookie, see below. - */ -#define SA_BUSMASK 0x0f000 -#define SA_SBUS 0x01000 -#define SA_PCI 0x02000 -#define SA_FHC 0x03000 -#define SA_EBUS 0x04000 -#define SA_BUS(mask) ((mask) & SA_BUSMASK) +#include <linux/kernel.h> struct devid_cookie { - /* Caller specifies these. */ - void *real_dev_id; /* What dev_id would usually contain. */ - unsigned int *imap; /* Anonymous IMAP register */ - unsigned int *iclr; /* Anonymous ICLR register */ - int pil; /* Anonymous PIL */ - void *bus_cookie; /* SYSIO regs, PSYCHO regs, etc. */ - - /* Return values. */ - unsigned int ret_ino; - unsigned int ret_pil; + int dummy; +}; + +/* You should not mess with this directly. That's the job of irq.c. */ +struct ino_bucket { + unsigned short ino; + short imap_off; + unsigned short pil; + unsigned short flags; + unsigned int *iclr; }; -#define SA_DCOOKIE 0x10000 +#define __irq_ino(irq) ((struct ino_bucket *)(unsigned long)(irq))->ino +#define __irq_pil(irq) ((struct ino_bucket *)(unsigned long)(irq))->pil + +static __inline__ char *__irq_itoa(unsigned int irq) +{ + static char buff[16]; + + sprintf(buff, "%d,%x", __irq_pil(irq), __irq_ino(irq)); + return buff; +} #define NR_IRQS 15 @@ -41,6 +41,9 @@ extern void disable_irq(unsigned int); extern void enable_irq(unsigned int); extern void init_timers(void (*lvl10_irq)(int, void *, struct pt_regs *), unsigned long *); +extern unsigned int build_irq(int pil, int inofixup, unsigned int *iclr, unsigned int *imap); +extern unsigned int sbus_build_irq(void *sbus, unsigned int ino); +extern unsigned int psycho_build_irq(void *psycho, int imap_off, int ino, int need_dma_sync); #ifdef __SMP__ extern void set_cpu_int(int, int); @@ -76,9 +79,4 @@ extern __inline__ unsigned long get_softint(void) return retval; } -static __inline__ int irq_cannonicalize(int irq) -{ - return irq; -} - #endif diff --git a/include/asm-sparc64/linux_logo.h b/include/asm-sparc64/linux_logo.h index 59bd61866..df564adcd 100644 --- a/include/asm-sparc64/linux_logo.h +++ b/include/asm-sparc64/linux_logo.h @@ -1,4 +1,4 @@ -/* $Id: linux_logo.h,v 1.3 1997/08/25 07:50:35 jj Exp $ +/* $Id: linux_logo.h,v 1.6 1998/07/30 16:30:48 jj Exp $ * include/asm-sparc64/linux_logo.h: This is a linux logo * to be displayed on boot. * @@ -23,899 +23,904 @@ #define linux_logo_banner "Linux/UltraSPARC version " UTS_RELEASE -#define LINUX_LOGO_COLORS 215 +#define LINUX_LOGO_COLORS 219 + +#ifdef INCLUDE_LINUX_LOGO_DATA unsigned char linux_logo_red[] __initdata = { - 0x99, 0x95, 0x92, 0x8E, 0x8A, 0x86, 0x02, 0x00, - 0xA5, 0xA9, 0xA2, 0x9E, 0xAD, 0x1B, 0x3B, 0x25, - 0x71, 0x65, 0x2C, 0x82, 0x5B, 0x33, 0x13, 0xB0, - 0x0C, 0xB1, 0xD4, 0xCE, 0x04, 0x06, 0x16, 0xB6, - 0xCD, 0xB2, 0x42, 0x46, 0x4B, 0xA8, 0xF3, 0xCA, - 0xC5, 0x1C, 0xDC, 0xA0, 0xD4, 0xE6, 0xED, 0xF3, - 0xC2, 0x8E, 0xCC, 0xA5, 0x7E, 0x52, 0xF7, 0xE3, - 0x56, 0x79, 0x68, 0x8D, 0xAF, 0xFC, 0x8E, 0x3E, - 0x6B, 0x11, 0x37, 0x79, 0x5C, 0x3C, 0x3F, 0x3C, - 0x48, 0x47, 0x3D, 0xB9, 0x62, 0xE1, 0x4D, 0x57, - 0x84, 0x78, 0xA6, 0x58, 0x99, 0xCD, 0xB7, 0xE3, - 0x6D, 0x5A, 0xAF, 0x79, 0x79, 0xF2, 0x42, 0x46, - 0xDD, 0x89, 0xC3, 0xF2, 0xF0, 0xE0, 0xD1, 0x90, - 0x76, 0x6B, 0x4A, 0xBE, 0xBD, 0xE3, 0xF6, 0xE9, - 0xEC, 0xE8, 0xEC, 0xC0, 0x66, 0x63, 0xCB, 0xAB, - 0x49, 0x5C, 0xAD, 0xD6, 0xEE, 0xF5, 0xF5, 0xE9, - 0x6E, 0x00, 0x69, 0x6A, 0xA1, 0x7A, 0xB4, 0xDE, - 0xF1, 0xF6, 0xDD, 0x00, 0x73, 0xDB, 0x4C, 0x53, - 0x6A, 0xF5, 0xF5, 0xD6, 0xC3, 0x6A, 0x4B, 0x4B, - 0x60, 0xF8, 0x9B, 0xD7, 0xD7, 0x71, 0xB3, 0xA4, - 0xCA, 0xAB, 0xB4, 0xB2, 0x76, 0xBA, 0x8B, 0xA0, - 0xA5, 0xEE, 0xE7, 0x67, 0x5F, 0x08, 0x94, 0xDB, - 0xE5, 0x4F, 0x00, 0x34, 0xEE, 0xEC, 0xE2, 0x48, - 0xF3, 0xEB, 0xF4, 0xF4, 0xEF, 0xD6, 0xB6, 0xE6, - 0xE6, 0xED, 0xE7, 0xE6, 0x3D, 0xE7, 0xCD, 0x44, - 0xEF, 0xEC, 0xF5, 0x66, 0xF3, 0xA9, 0x77, 0x58, - 0x75, 0x6C, 0x53, 0x24, 0xAC, 0x0D, 0x3C + 0x03, 0x9E, 0xEC, 0xEE, 0xC4, 0xDA, 0x50, 0xC9, + 0xC5, 0xED, 0x65, 0xE3, 0xE3, 0xF4, 0x24, 0xA4, + 0xEC, 0xEE, 0x94, 0xE5, 0xE3, 0x6A, 0xA6, 0xC4, + 0xDC, 0xE5, 0x13, 0xF3, 0xD1, 0xFD, 0xE2, 0xDB, + 0xA0, 0xC2, 0xEC, 0xB8, 0xC2, 0xD5, 0xF2, 0xF4, + 0xC5, 0x3E, 0xF1, 0x1B, 0x55, 0xF5, 0xCF, 0xF7, + 0xA9, 0xB4, 0xEB, 0x6C, 0x0A, 0x74, 0xB4, 0xF7, + 0xF0, 0xF5, 0xD4, 0xF2, 0xCE, 0xF5, 0xC7, 0x26, + 0x5B, 0xF4, 0xBC, 0x7F, 0xAB, 0x82, 0x94, 0xE5, + 0xFC, 0x3A, 0xF2, 0xFD, 0xF0, 0x1C, 0xEF, 0xD4, + 0xF3, 0x0F, 0xED, 0xF7, 0xC9, 0x49, 0xC3, 0xBA, + 0xC8, 0xD4, 0xE7, 0xF3, 0xF5, 0xA7, 0xEC, 0xF9, + 0xFA, 0x0A, 0xF5, 0xCF, 0xFC, 0xEA, 0xE1, 0xA6, + 0xD6, 0xBC, 0xF8, 0xF7, 0xB4, 0xEB, 0xDC, 0x84, + 0xCE, 0xBA, 0x45, 0xD6, 0x86, 0x50, 0x96, 0xC6, + 0x8C, 0x6E, 0xE8, 0x60, 0x3C, 0x70, 0xF0, 0x93, + 0x7C, 0xDA, 0xDA, 0x9C, 0xBA, 0x6D, 0x4D, 0x2B, + 0x2F, 0x8B, 0xE0, 0xCC, 0xDA, 0x5C, 0x3D, 0xEE, + 0xDB, 0x46, 0xAC, 0x96, 0xCE, 0xD1, 0xE3, 0xF1, + 0x96, 0x7A, 0x80, 0xB2, 0xBA, 0xB6, 0xD2, 0x1E, + 0x7E, 0xAA, 0xC4, 0xF0, 0x96, 0x65, 0x9E, 0xC2, + 0xAA, 0xF5, 0xF2, 0xE9, 0xE6, 0xD1, 0x35, 0xC7, + 0xF6, 0xB6, 0xE8, 0x82, 0xBE, 0xC2, 0xF2, 0x9E, + 0xC7, 0xB4, 0x0F, 0xF7, 0xE8, 0xD8, 0xCC, 0x9C, + 0xD8, 0xD8, 0xA0, 0xEA, 0xC6, 0xA8, 0xE0, 0xEC, + 0xD1, 0xF7, 0xF4, 0xFC, 0x75, 0xBD, 0xDC, 0xDD, + 0xCC, 0xE1, 0xFA, 0xEE, 0xAA, 0xEC, 0xF2, 0xB8, + 0xE2, 0xCD, 0x87 }; unsigned char linux_logo_green[] __initdata = { - 0x99, 0x95, 0x92, 0x8E, 0x8A, 0x86, 0x02, 0x00, - 0xA5, 0xA9, 0xA2, 0x9E, 0xAD, 0x1B, 0x3B, 0x25, - 0x71, 0x65, 0x2C, 0x82, 0x5B, 0x33, 0x13, 0xAD, - 0x0C, 0xB1, 0x92, 0xAB, 0x03, 0x06, 0x16, 0xB6, - 0xCD, 0x88, 0x42, 0x46, 0x4B, 0x94, 0xBB, 0xCA, - 0xC5, 0x1C, 0xAB, 0xA0, 0xD4, 0xE6, 0xED, 0xF3, - 0xC2, 0x73, 0xCA, 0x91, 0x7E, 0x52, 0xF7, 0xE3, - 0x56, 0x5A, 0x49, 0x56, 0x6E, 0xFC, 0x6B, 0x3E, - 0x6B, 0x0D, 0x37, 0x79, 0x51, 0x44, 0x3F, 0x43, - 0x38, 0x3D, 0x48, 0xB9, 0x62, 0xA5, 0x47, 0x48, - 0x49, 0x4A, 0x97, 0x48, 0x81, 0x95, 0x8E, 0xE3, - 0x6D, 0x57, 0x51, 0x51, 0x47, 0xB2, 0x42, 0x46, - 0xDD, 0x5B, 0x87, 0xBE, 0xC7, 0xC8, 0x56, 0x75, - 0x5D, 0x4B, 0x4D, 0xBE, 0x85, 0xA6, 0xBC, 0xC7, - 0xCA, 0xCD, 0xCC, 0xA4, 0x53, 0x4D, 0x9F, 0x55, - 0x52, 0x5E, 0x75, 0x9C, 0xB6, 0xC3, 0xD7, 0xCC, - 0x55, 0x00, 0x6A, 0x59, 0x7D, 0x55, 0x7C, 0xA3, - 0xB7, 0xBF, 0xA5, 0x00, 0x67, 0xC6, 0x47, 0x54, - 0x46, 0xB8, 0xBE, 0xB2, 0x87, 0x52, 0x4B, 0x43, - 0x41, 0xF8, 0x69, 0x96, 0x9B, 0x66, 0xB0, 0x6C, - 0x8E, 0x81, 0xB4, 0x76, 0x76, 0xB9, 0x65, 0x77, - 0x6D, 0xED, 0xE7, 0x67, 0x5F, 0x06, 0x54, 0x6C, - 0xCB, 0x4F, 0x00, 0x2F, 0xC2, 0xB5, 0xB6, 0x30, - 0xC3, 0xAE, 0xC4, 0xCA, 0xC6, 0xB4, 0x7B, 0xAD, - 0xAD, 0xB6, 0xB6, 0xAD, 0x29, 0xAB, 0x93, 0x2E, - 0xBC, 0xBC, 0xC9, 0x53, 0xBF, 0x77, 0x54, 0x3B, - 0x4B, 0x3F, 0x39, 0x19, 0x76, 0x08, 0x2C + 0x03, 0x88, 0xC4, 0xE2, 0x85, 0xC2, 0x44, 0xA3, + 0xA9, 0xD3, 0x65, 0xA6, 0xC5, 0xF3, 0x24, 0xA4, + 0xB4, 0xD6, 0x63, 0xD5, 0xB7, 0x44, 0x86, 0x94, + 0xC2, 0xE4, 0x14, 0xB6, 0xD2, 0xFB, 0xD4, 0xB2, + 0x73, 0x96, 0xDB, 0x92, 0xC2, 0x95, 0xC2, 0xDA, + 0xA4, 0x36, 0xD4, 0x0E, 0x55, 0xF4, 0xC4, 0xE9, + 0x75, 0xB4, 0xBC, 0x52, 0x0A, 0x74, 0x84, 0xEB, + 0xDC, 0xDA, 0xA2, 0xD6, 0x9B, 0xBD, 0xB7, 0x12, + 0x44, 0xCA, 0x8C, 0x65, 0x7B, 0x54, 0x94, 0xAB, + 0xF4, 0x25, 0xC4, 0xFD, 0xE4, 0x1C, 0xDD, 0xAB, + 0xBD, 0x06, 0xCB, 0xD6, 0xCA, 0x33, 0x8C, 0xA2, + 0x92, 0x9C, 0xBC, 0xDB, 0xCD, 0x6E, 0xEC, 0xEE, + 0xBC, 0x03, 0xDA, 0xCE, 0xF4, 0xB6, 0xDB, 0x92, + 0xAD, 0xBC, 0xDE, 0xD5, 0x7B, 0xAE, 0x9D, 0x84, + 0xB6, 0x96, 0x44, 0xBA, 0x6E, 0x3C, 0x7A, 0xB2, + 0x8C, 0x4C, 0xCE, 0x4C, 0x3C, 0x5A, 0xCA, 0x6D, + 0x7C, 0xCE, 0xDA, 0x9C, 0xAA, 0x6D, 0x4D, 0x2B, + 0x1B, 0x5E, 0xCB, 0xAC, 0xBE, 0x5C, 0x2E, 0xDC, + 0xBD, 0x3E, 0xAC, 0x82, 0xB6, 0xBE, 0xD3, 0xBD, + 0x72, 0x62, 0x6C, 0x82, 0x92, 0x9E, 0xB0, 0x13, + 0x4A, 0x8E, 0xBE, 0xCE, 0x86, 0x45, 0x6B, 0xAA, + 0x9A, 0xC5, 0xC6, 0xDA, 0xC5, 0xC4, 0x34, 0x9B, + 0xCC, 0xAC, 0xC4, 0x76, 0x9A, 0x9E, 0xEE, 0x62, + 0xC6, 0x76, 0x0D, 0xE4, 0xDA, 0xD5, 0xA5, 0x92, + 0xCD, 0xB2, 0x7C, 0xCC, 0xBE, 0x7E, 0xDC, 0xD6, + 0xB9, 0xE3, 0xD4, 0xF6, 0x55, 0x82, 0xA4, 0xAA, + 0x8D, 0xBB, 0xCE, 0xD5, 0x8A, 0xDB, 0xD4, 0x8B, + 0xCA, 0x93, 0x63 }; unsigned char linux_logo_blue[] __initdata = { - 0x99, 0x95, 0x92, 0x8E, 0x8A, 0x86, 0xD6, 0x00, - 0xA5, 0xA9, 0xA2, 0x9E, 0xAD, 0x1B, 0x39, 0x25, - 0x71, 0x65, 0x2C, 0x82, 0x5B, 0x33, 0x13, 0xA7, - 0x0C, 0xB1, 0x58, 0x8A, 0x03, 0x07, 0x16, 0xB6, - 0xCD, 0x5A, 0x42, 0x46, 0x4F, 0x6F, 0x77, 0xCA, - 0xC5, 0x1C, 0x6F, 0xA5, 0xD4, 0xE6, 0xF5, 0xF3, - 0xC2, 0x4D, 0xD1, 0x64, 0x7E, 0x52, 0xF7, 0xE3, - 0x56, 0x49, 0x3C, 0x47, 0x45, 0xFE, 0x3B, 0x41, - 0x6B, 0x09, 0x37, 0x79, 0x39, 0x39, 0x3F, 0x42, - 0x3A, 0x42, 0x5F, 0xB9, 0x62, 0x4C, 0x39, 0x44, - 0x3B, 0x3A, 0xA0, 0x3D, 0x08, 0x08, 0x09, 0xDE, - 0x6D, 0x48, 0x3B, 0x3F, 0x42, 0xF3, 0x36, 0x3C, - 0xDD, 0x06, 0x16, 0x08, 0x13, 0x0A, 0x4B, 0x71, - 0x5D, 0x44, 0x47, 0xBE, 0x08, 0x0C, 0x0D, 0x0C, - 0x19, 0x29, 0x36, 0x06, 0x43, 0x44, 0xBA, 0x45, - 0x50, 0x58, 0x07, 0x07, 0x0D, 0x0E, 0x10, 0x50, - 0x06, 0x42, 0x40, 0x44, 0x79, 0x06, 0x06, 0x0C, - 0x08, 0x08, 0x07, 0x36, 0x4C, 0xE5, 0x42, 0x55, - 0x03, 0x0F, 0x12, 0x06, 0x07, 0x3C, 0x4B, 0x3D, - 0x01, 0xF8, 0x08, 0x0E, 0x0A, 0x69, 0xAC, 0x0C, - 0x0A, 0x27, 0xBB, 0x36, 0x76, 0xC0, 0x04, 0x08, - 0x08, 0xED, 0xEE, 0x68, 0x5F, 0xB2, 0x3B, 0x52, - 0xAC, 0x4F, 0x6F, 0x2D, 0x16, 0x08, 0x59, 0x04, - 0x13, 0x0E, 0x14, 0x17, 0x16, 0x2E, 0x08, 0x0D, - 0x11, 0x14, 0x0D, 0x06, 0x04, 0x08, 0x25, 0x8E, - 0x0E, 0x14, 0x25, 0x9B, 0x1C, 0x16, 0x78, 0x06, - 0x04, 0x03, 0x79, 0x8C, 0x0B, 0xC8, 0x48 + 0x04, 0x28, 0x10, 0x8C, 0x0B, 0x84, 0x14, 0x1A, + 0x77, 0x1F, 0x64, 0x0E, 0x85, 0xD2, 0x24, 0xA4, + 0x0F, 0x54, 0x0C, 0x7C, 0x3F, 0x04, 0x20, 0x0D, + 0x54, 0xDF, 0x14, 0x0D, 0xD1, 0xE9, 0xB0, 0x11, + 0x0A, 0x40, 0x57, 0x14, 0xC3, 0x0C, 0x04, 0x12, + 0x50, 0x0C, 0x7D, 0x05, 0x55, 0xF2, 0xBA, 0xC7, + 0x09, 0xB4, 0x0E, 0x24, 0x0B, 0x74, 0x0C, 0xB6, + 0x80, 0x48, 0x10, 0x34, 0x0F, 0x0C, 0xA0, 0x04, + 0x19, 0x10, 0x0E, 0x14, 0x0E, 0x05, 0x94, 0x0E, + 0xCA, 0x0B, 0x46, 0xFB, 0xB4, 0x1C, 0x9B, 0x1A, + 0x21, 0x09, 0x14, 0x4D, 0xCB, 0x08, 0x11, 0x7C, + 0x20, 0x10, 0x24, 0x66, 0x79, 0x07, 0xEA, 0xC9, + 0x0C, 0x08, 0x38, 0xC4, 0xD8, 0x24, 0xBE, 0x6C, + 0x51, 0xBB, 0x8C, 0x36, 0x0A, 0x0F, 0x0C, 0x84, + 0x3C, 0x54, 0x44, 0x7C, 0x28, 0x0E, 0x28, 0x7F, + 0x8C, 0x0F, 0x54, 0x24, 0x3C, 0x18, 0x54, 0x17, + 0x7C, 0x9C, 0xDA, 0x9C, 0x7C, 0x6C, 0x4D, 0x2C, + 0x09, 0x0E, 0x8A, 0x50, 0x4C, 0x5B, 0x14, 0xAC, + 0x19, 0x3C, 0xAC, 0x5C, 0x64, 0x97, 0x94, 0x37, + 0x29, 0x3C, 0x44, 0x3C, 0x2C, 0x7C, 0x70, 0x07, + 0x04, 0x29, 0xB2, 0x64, 0x74, 0x07, 0x07, 0x2C, + 0x74, 0x2E, 0x6C, 0xA4, 0x29, 0x9E, 0x34, 0x27, + 0x2F, 0x98, 0x48, 0x5C, 0x0C, 0x5C, 0xE8, 0x04, + 0xC2, 0x0C, 0x0A, 0xB2, 0x74, 0xCB, 0x46, 0x78, + 0xB4, 0x5C, 0x18, 0x80, 0x8C, 0x24, 0xD9, 0xAC, + 0x87, 0x99, 0x1D, 0xE8, 0x14, 0x0D, 0x10, 0x17, + 0x0A, 0x67, 0x3C, 0x68, 0x3C, 0x69, 0x90, 0x22, + 0x6C, 0x0D, 0x17 }; unsigned char linux_logo[] __initdata = { + 0xD8, 0xA3, 0x98, 0x98, 0xA3, 0xB2, 0x2F, 0x2F, + 0xA3, 0x66, 0x98, 0x98, 0x98, 0xA3, 0x2F, 0xA3, + 0x98, 0x55, 0xA0, 0xA3, 0xB2, 0x51, 0x51, 0x2F, + 0x98, 0x55, 0x8F, 0x2F, 0x89, 0x44, 0x89, 0x51, + 0xB2, 0x2F, 0x66, 0xA3, 0x2F, 0x2F, 0x66, 0x66, + 0xA3, 0xB2, 0xB2, 0xB2, 0x89, 0xD8, 0x44, 0x44, + 0xD8, 0x83, 0xD8, 0xA3, 0x98, 0x98, 0xA3, 0xB2, + 0x2F, 0x2F, 0xA3, 0x66, 0x98, 0x98, 0x98, 0xA3, + 0x2F, 0xA3, 0x98, 0x55, 0xA0, 0xA3, 0xB2, 0x51, + 0x51, 0x2F, 0x98, 0x55, 0x8F, 0x2F, 0x89, 0x44, + 0xA3, 0x55, 0x55, 0x98, 0x2F, 0x2F, 0x2F, 0xA3, + 0x66, 0x66, 0x98, 0x98, 0x66, 0x66, 0x66, 0x98, + 0x55, 0xA5, 0x8F, 0xA3, 0x51, 0x51, 0xB2, 0x2F, + 0x66, 0x66, 0xA3, 0x51, 0x89, 0x51, 0xB2, 0x2F, + 0x2F, 0xA3, 0x66, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, + 0xB2, 0xB2, 0x2F, 0x2F, 0xB2, 0x51, 0x51, 0x51, + 0x51, 0x51, 0xA3, 0x55, 0x55, 0x98, 0x2F, 0x2F, + 0x2F, 0xA3, 0x66, 0x66, 0x98, 0x98, 0x66, 0x66, + 0x66, 0x98, 0x55, 0xA5, 0x8F, 0xA3, 0x51, 0x51, + 0xB2, 0x2F, 0x66, 0x66, 0xA3, 0x51, 0x89, 0x51, + 0x98, 0xA5, 0x55, 0x8F, 0x2F, 0xB2, 0x2F, 0xA3, + 0x66, 0x66, 0x98, 0x8F, 0x66, 0x66, 0x66, 0x98, + 0xA0, 0x8F, 0xA3, 0xB2, 0x51, 0x51, 0xB2, 0x2F, + 0xA3, 0xA3, 0x2F, 0xB2, 0x51, 0xB2, 0x2F, 0x2F, + 0xA3, 0x66, 0x98, 0xA3, 0x51, 0xB2, 0x2F, 0xA3, + 0xB2, 0x51, 0x51, 0xB2, 0xB2, 0x51, 0xB2, 0xB2, + 0xB2, 0x2F, 0x98, 0xA5, 0x55, 0x8F, 0x2F, 0xB2, + 0x2F, 0xA3, 0x66, 0x66, 0x98, 0x8F, 0x66, 0x66, + 0x66, 0x98, 0xA0, 0x8F, 0xA3, 0xB2, 0x51, 0x51, + 0xB2, 0x2F, 0xA3, 0xA3, 0x2F, 0x51, 0x51, 0xB2, + 0xA0, 0xA5, 0x55, 0x66, 0xB2, 0x51, 0xB2, 0xA3, + 0x66, 0x66, 0x98, 0x66, 0x66, 0x66, 0x98, 0x98, + 0x66, 0xA3, 0x2F, 0xB2, 0x51, 0x51, 0xB2, 0xA3, + 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0xA3, + 0x66, 0x98, 0xB2, 0x4C, 0x54, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0xCE, 0x2F, 0xB2, 0x2F, 0x2F, + 0xA3, 0x98, 0xA0, 0xA5, 0x55, 0x66, 0xB2, 0x51, + 0xB2, 0xA3, 0x66, 0x66, 0x98, 0x66, 0x66, 0x66, + 0x98, 0x98, 0x66, 0xA3, 0x2F, 0xB2, 0x51, 0x51, + 0xB2, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, + 0xA0, 0xA0, 0x8F, 0xA3, 0xB2, 0x51, 0xB2, 0x2F, + 0x66, 0x66, 0x98, 0x66, 0x66, 0x66, 0x66, 0x66, + 0xA3, 0x2F, 0x51, 0x51, 0x51, 0xB2, 0x2F, 0xA3, + 0x66, 0x66, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, + 0x2F, 0xA0, 0xDA, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x9C, 0xB2, 0xA3, + 0x66, 0x98, 0xA0, 0xA0, 0x8F, 0xA3, 0xB2, 0x51, + 0xB2, 0x2F, 0x66, 0x66, 0x98, 0x66, 0x66, 0x66, + 0x66, 0x66, 0xA3, 0x2F, 0x51, 0x51, 0x51, 0xB2, + 0x2F, 0xA3, 0x66, 0x66, 0x66, 0xA3, 0xA3, 0xA3, + 0x8F, 0x8F, 0x66, 0x2F, 0x51, 0x51, 0xB2, 0xA3, + 0x66, 0x98, 0x98, 0x66, 0x66, 0x66, 0x2F, 0x2F, + 0xB2, 0x51, 0xB2, 0xB2, 0x2F, 0x2F, 0xA3, 0x66, + 0x66, 0x66, 0xA3, 0xA3, 0x2F, 0xA3, 0xA3, 0xB2, + 0x9C, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0xDA, 0x3A, 0x20, 0x54, 0x55, + 0xA3, 0x98, 0x8F, 0x8F, 0x66, 0x2F, 0x51, 0x51, + 0xB2, 0xA3, 0x66, 0x98, 0x98, 0x66, 0x66, 0x66, + 0x2F, 0x2F, 0xB2, 0x51, 0xB2, 0xB2, 0x2F, 0x2F, + 0xA3, 0x66, 0x66, 0x66, 0x2F, 0xA3, 0x2F, 0x2F, + 0x66, 0x66, 0xA3, 0x2F, 0xB2, 0xB2, 0x2F, 0x66, + 0x8F, 0x8F, 0x8F, 0x66, 0xA3, 0xA3, 0xB2, 0xB2, + 0xB2, 0xB2, 0xB2, 0xB2, 0x2F, 0xA3, 0xA3, 0xA3, + 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0xAD, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0xA7, 0x4C, 0xCE, 0xDA, 0x20, + 0xA6, 0x2F, 0x66, 0x66, 0xA3, 0x2F, 0xB2, 0xB2, + 0x2F, 0x66, 0x8F, 0x8F, 0x8F, 0x66, 0xA3, 0xA3, + 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0x2F, 0xA3, + 0xA3, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, + 0xA3, 0x98, 0x66, 0x2F, 0xB2, 0xB2, 0x2F, 0x98, + 0x8F, 0x8F, 0x98, 0x66, 0xA3, 0xB2, 0xB2, 0xB2, + 0x2F, 0x2F, 0x2F, 0x2F, 0xA3, 0x2F, 0xA3, 0xA3, + 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0x51, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0xCE, 0x55, 0xAD, 0xA7, 0x54, + 0x20, 0x8F, 0xA3, 0x98, 0x66, 0x2F, 0xB2, 0xB2, + 0x2F, 0x98, 0x8F, 0x8F, 0x98, 0x66, 0xA3, 0xB2, + 0xB2, 0xB2, 0x2F, 0x2F, 0x2F, 0x2F, 0xA3, 0x2F, + 0xA3, 0xA3, 0xA3, 0x2F, 0xA3, 0xA3, 0xA3, 0xA3, + 0xA3, 0x8F, 0x66, 0x2F, 0xB2, 0x51, 0x2F, 0x98, + 0xA0, 0x8F, 0x66, 0xA3, 0x2F, 0x51, 0x51, 0xB2, + 0xA3, 0xA3, 0xA3, 0x2F, 0xA3, 0xA3, 0x66, 0x66, + 0x98, 0x98, 0x98, 0x66, 0x98, 0x66, 0x55, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x21, 0x21, 0x22, 0x23, 0x24, 0x24, - 0x25, 0x24, 0x24, 0x25, 0x25, 0x25, 0x25, 0x25, - 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x23, 0x23, - 0x23, 0x22, 0x22, 0x22, 0x22, 0x21, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x26, 0x27, 0x27, 0x27, 0x27, - 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x26, 0x28, - 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, - 0x29, 0x28, 0x28, 0x28, 0x2A, 0x2A, 0x2B, 0x2B, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x2B, 0x2B, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, - 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, - 0x28, 0x28, 0x28, 0x29, 0x29, 0x29, 0x29, 0x29, - 0x29, 0x29, 0x29, 0x2C, 0x29, 0x29, 0x29, 0x28, - 0x28, 0x2A, 0x2B, 0x2B, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x2B, 0x2B, 0x2A, 0x2A, - 0x2A, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, - 0x27, 0x27, 0x27, 0x27, 0x2D, 0x2E, 0x2F, 0x27, - 0x27, 0x26, 0x2B, 0x2A, 0x2A, 0x2A, 0x2A, 0x28, - 0x28, 0x29, 0x29, 0x29, 0x29, 0x2C, 0x2C, 0x29, - 0x29, 0x29, 0x28, 0x28, 0x2A, 0x2B, 0x20, 0x20, + 0x20, 0x20, 0x20, 0xCE, 0x4C, 0x9C, 0x2E, 0xDA, + 0x20, 0xDA, 0x51, 0x8F, 0x66, 0x2F, 0xB2, 0x51, + 0x2F, 0x98, 0xA0, 0x8F, 0x66, 0xA3, 0x2F, 0x51, + 0x51, 0xB2, 0xA3, 0xA3, 0xA3, 0x2F, 0xA3, 0xA3, + 0x66, 0x66, 0x98, 0x98, 0x98, 0x98, 0x98, 0x66, + 0x51, 0x66, 0x2F, 0xB2, 0x51, 0xB2, 0xA3, 0xA0, + 0xA0, 0x66, 0xA3, 0xB2, 0xB2, 0xB2, 0xB2, 0xA3, + 0x66, 0x66, 0x66, 0xA3, 0xA3, 0x66, 0x98, 0x98, + 0x98, 0x98, 0x98, 0x66, 0x66, 0xB2, 0x6D, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6D, 0x3A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0xA5, 0x66, 0x2F, 0xB2, 0x51, 0xB2, + 0xA3, 0xA0, 0xA0, 0x66, 0xA3, 0xB2, 0xB2, 0xB2, + 0xB2, 0xA3, 0x66, 0x66, 0x66, 0xA3, 0xA3, 0x66, + 0x98, 0x98, 0x8F, 0x98, 0x66, 0x66, 0x66, 0x66, + 0x51, 0x2F, 0xB2, 0x51, 0x51, 0x2F, 0x66, 0xA0, + 0x8F, 0xA3, 0x2F, 0xB2, 0xB2, 0x2F, 0x2F, 0x66, + 0x98, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x2F, 0xA3, 0x2F, 0x2F, 0x51, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0xDA, 0x51, 0xB2, 0x51, 0x51, 0x2F, + 0x66, 0xA0, 0x8F, 0xA3, 0x2F, 0xB2, 0xB2, 0x2F, + 0x2F, 0x66, 0x98, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, + 0x51, 0x2F, 0xB2, 0x51, 0x2F, 0xA3, 0x8F, 0x8F, + 0x98, 0xA3, 0xB2, 0xB2, 0x2F, 0xA3, 0x98, 0x66, + 0x98, 0x98, 0x66, 0x66, 0x66, 0x66, 0xA3, 0x2F, + 0xB2, 0xB2, 0x51, 0xB2, 0xB2, 0x66, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x2B, 0x2B, 0x2B, 0x2A, 0x2A, 0x2A, - 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, - 0x27, 0x27, 0x27, 0x27, 0x2F, 0x30, 0x31, 0x32, - 0x27, 0x27, 0x22, 0x22, 0x22, 0x22, 0x21, 0x20, - 0x20, 0x20, 0x2B, 0x2A, 0x28, 0x29, 0x29, 0x29, - 0x2C, 0x2C, 0x2C, 0x29, 0x29, 0x28, 0x2A, 0x2B, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0xA3, 0xB2, 0x51, 0x2F, 0xA3, + 0x8F, 0x8F, 0x98, 0xA3, 0xB2, 0xB2, 0x2F, 0xA3, + 0x98, 0x66, 0x98, 0x98, 0x66, 0x66, 0x66, 0x66, + 0xA3, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, + 0xB2, 0x2F, 0xA3, 0x2F, 0x66, 0x98, 0x8F, 0x98, + 0xA3, 0x2F, 0x2F, 0xA3, 0x98, 0x98, 0x98, 0x98, + 0x66, 0x98, 0x66, 0x98, 0x66, 0xA3, 0x2F, 0xB2, + 0x51, 0x51, 0x51, 0xB2, 0xB2, 0x8F, 0x20, 0x20, + 0x20, 0x54, 0x6D, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x54, 0x6D, 0x6D, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x4C, 0xA3, 0x2F, 0x66, 0x98, + 0x8F, 0x98, 0xA3, 0x2F, 0x2F, 0xA3, 0x98, 0x98, + 0x98, 0x98, 0x66, 0x98, 0x66, 0x98, 0x66, 0xA3, + 0x2F, 0xB2, 0x51, 0x51, 0x51, 0xB2, 0x2F, 0x2F, + 0x2F, 0xA3, 0xA3, 0x66, 0x98, 0x98, 0x8F, 0x98, + 0x2F, 0x2F, 0x2F, 0x66, 0x8F, 0x8F, 0x98, 0xA3, + 0x66, 0x66, 0x8F, 0x98, 0x98, 0x66, 0x2F, 0xB2, + 0x51, 0xB2, 0x2F, 0xA3, 0xA3, 0xA0, 0x20, 0x20, + 0xDA, 0x2E, 0x3A, 0xA7, 0x20, 0x20, 0x20, 0x20, + 0x20, 0xCE, 0x2A, 0x2A, 0x2E, 0xA7, 0xDA, 0x20, + 0x20, 0x20, 0x20, 0x9C, 0xA3, 0x66, 0x98, 0x98, + 0x8F, 0x98, 0x2F, 0x2F, 0x2F, 0x66, 0x8F, 0x8F, + 0x98, 0xA3, 0x66, 0x66, 0x8F, 0x98, 0x98, 0x66, + 0x2F, 0xB2, 0x51, 0xB2, 0x2F, 0x2F, 0xA3, 0xA3, + 0xB2, 0xA3, 0x66, 0x98, 0x8F, 0x8F, 0x66, 0xA3, + 0x2F, 0x2F, 0x66, 0x98, 0x98, 0x66, 0x2F, 0x2F, + 0xA3, 0x98, 0x8F, 0x98, 0x66, 0x2F, 0xB2, 0xB2, + 0xB2, 0xA3, 0x66, 0x66, 0x66, 0x98, 0x20, 0x3A, + 0x98, 0x89, 0x8F, 0x6D, 0x20, 0x20, 0x20, 0x20, + 0x4C, 0x66, 0x51, 0x44, 0x51, 0x2E, 0x54, 0x20, + 0x20, 0x20, 0x20, 0xA7, 0x66, 0x98, 0x8F, 0x8F, + 0x66, 0xA3, 0x2F, 0x2F, 0x66, 0x98, 0x98, 0x66, + 0x2F, 0x2F, 0xA3, 0x98, 0x8F, 0x98, 0x66, 0x2F, + 0xB2, 0xB2, 0xB2, 0xA3, 0x66, 0x66, 0x66, 0xA3, + 0x2F, 0x66, 0x98, 0x8F, 0x8F, 0x98, 0x66, 0x2F, + 0x2F, 0xA3, 0x66, 0x98, 0x98, 0xA3, 0x2F, 0xB2, + 0xA3, 0x8F, 0x98, 0xA3, 0xB2, 0x51, 0x89, 0x89, + 0xB2, 0xA3, 0x66, 0x98, 0x66, 0x98, 0x20, 0xA6, + 0x44, 0x39, 0xE6, 0x98, 0x20, 0x20, 0x20, 0x9C, + 0x74, 0xD6, 0x7E, 0xD6, 0x39, 0x8F, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x2E, 0x98, 0x8F, 0x8F, 0x98, + 0x66, 0x2F, 0x2F, 0xA3, 0x66, 0x98, 0x98, 0xA3, + 0x2F, 0xB2, 0x66, 0x98, 0x8F, 0xA3, 0xB2, 0x51, + 0x89, 0x89, 0xB2, 0xA3, 0x66, 0x98, 0x66, 0x66, + 0x2F, 0x66, 0x8F, 0xA0, 0x8F, 0x98, 0xA3, 0xB2, + 0x2F, 0x66, 0x66, 0x66, 0xA3, 0x2F, 0x2F, 0x2F, + 0x66, 0x98, 0xA3, 0xB2, 0x89, 0x44, 0x89, 0x51, + 0x2F, 0x66, 0x98, 0x98, 0xA3, 0x66, 0x20, 0x2F, + 0x2F, 0xAD, 0x89, 0xD6, 0x3A, 0x20, 0x20, 0x55, + 0x6B, 0x51, 0x6D, 0x4C, 0xD8, 0xD6, 0x2E, 0x20, + 0x20, 0x20, 0x20, 0x54, 0x8F, 0xA0, 0x8F, 0x98, + 0xA3, 0xB2, 0x2F, 0x66, 0x66, 0x66, 0xA3, 0x2F, + 0xB2, 0x2F, 0x66, 0x66, 0xA3, 0xB2, 0x89, 0x44, + 0x89, 0x51, 0x2F, 0x66, 0x98, 0x98, 0xA3, 0xA3, + 0xA3, 0x66, 0x8F, 0xA0, 0x8F, 0x66, 0x2F, 0xB2, + 0xA3, 0x66, 0x98, 0x66, 0xA3, 0x2F, 0x2F, 0xA3, + 0xA3, 0x2F, 0xB2, 0x89, 0xD8, 0xD8, 0x51, 0x66, + 0x8F, 0xA0, 0xA0, 0x8F, 0x98, 0xA3, 0x20, 0x44, + 0xA7, 0xCE, 0xA6, 0x4D, 0xCE, 0x6D, 0xA7, 0xA0, + 0x6B, 0xA7, 0x20, 0x92, 0xAD, 0x6B, 0x4C, 0x20, + 0x20, 0x20, 0x20, 0x54, 0x98, 0xA0, 0x8F, 0x66, + 0x2F, 0xB2, 0xA3, 0x66, 0x98, 0x66, 0xA3, 0x2F, + 0x2F, 0xA3, 0xA3, 0xA3, 0xB2, 0x89, 0xD8, 0xD8, + 0x51, 0x66, 0x8F, 0xA0, 0xA0, 0x8F, 0x98, 0x66, + 0x66, 0x66, 0x8F, 0x55, 0x8F, 0xA3, 0xB2, 0xB2, + 0xA3, 0x66, 0x66, 0xA3, 0x2F, 0xA3, 0xA3, 0xA3, + 0xA3, 0xB2, 0x89, 0x44, 0x44, 0x51, 0x66, 0xA0, + 0x55, 0xA5, 0x55, 0x8F, 0x66, 0xA3, 0x20, 0x44, + 0x6D, 0x54, 0xA7, 0x74, 0x2E, 0x4B, 0xBF, 0x9C, + 0x7E, 0xDA, 0x20, 0x54, 0x2E, 0x6B, 0x2A, 0x20, + 0x20, 0x20, 0x20, 0x3A, 0x8F, 0x55, 0x8F, 0xA3, + 0xB2, 0xB2, 0xA3, 0x66, 0x66, 0xA3, 0xA3, 0x2F, + 0xA3, 0xA3, 0xA3, 0xB2, 0x89, 0x44, 0x44, 0x51, + 0x66, 0xA0, 0xA5, 0xA5, 0x55, 0x8F, 0x66, 0x66, + 0xA0, 0xA0, 0xA0, 0xA0, 0x8F, 0xA3, 0x2F, 0xB2, + 0x66, 0x98, 0xA3, 0x2F, 0x2F, 0xB2, 0x2F, 0x2F, + 0xB2, 0x51, 0x89, 0x89, 0xB2, 0x98, 0xA0, 0x2A, + 0xA5, 0x55, 0x98, 0x66, 0xA3, 0xB2, 0x20, 0x2F, + 0x4C, 0x20, 0x4B, 0xBB, 0xCF, 0x6F, 0x27, 0x36, + 0x93, 0xCE, 0x20, 0x20, 0xA6, 0x3D, 0x4C, 0x20, + 0x20, 0x20, 0x20, 0xDA, 0xA0, 0xA0, 0x8F, 0xA3, + 0x2F, 0xB2, 0x66, 0x98, 0xA3, 0x2F, 0xB2, 0x2F, + 0x2F, 0x2F, 0xB2, 0x51, 0x89, 0x89, 0xB2, 0x98, + 0xA0, 0x2A, 0xA5, 0xA0, 0x8F, 0x66, 0xA3, 0xA3, + 0xA0, 0x8F, 0x8F, 0xA0, 0x8F, 0xA3, 0xB2, 0x2F, + 0x66, 0x98, 0x2F, 0xB2, 0xB2, 0xB2, 0xB2, 0x2F, + 0xB2, 0x89, 0x44, 0x51, 0x66, 0x55, 0xAD, 0x2A, + 0x55, 0x8F, 0x66, 0xA3, 0x2F, 0xB2, 0x20, 0x2A, + 0xE6, 0x95, 0xE5, 0x5A, 0x52, 0x52, 0x3F, 0x27, + 0x22, 0xC7, 0x9D, 0x60, 0xA2, 0xA2, 0x3A, 0x20, + 0x20, 0x20, 0x20, 0x54, 0x66, 0xA0, 0x8F, 0xA3, + 0xB2, 0x2F, 0x66, 0x98, 0x2F, 0xB2, 0xB2, 0xB2, + 0xB2, 0x2F, 0xB2, 0x89, 0x44, 0x51, 0x66, 0x55, + 0x2A, 0x2A, 0xA5, 0x8F, 0x66, 0xA3, 0x2F, 0x2F, + 0xA3, 0xA3, 0x66, 0x98, 0x98, 0x2F, 0xB2, 0xB2, + 0xA3, 0xA3, 0x2F, 0x51, 0x51, 0x51, 0x2F, 0x2F, + 0x51, 0x89, 0x89, 0x2F, 0x8F, 0x2A, 0x2A, 0xA5, + 0x8F, 0x66, 0xA3, 0xB2, 0x2F, 0x51, 0x20, 0x6D, + 0x77, 0xF7, 0xEE, 0x30, 0xB0, 0x72, 0x72, 0x5B, + 0x82, 0xEA, 0x72, 0xB0, 0x90, 0x96, 0x71, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x2F, 0x98, 0x98, 0x2F, + 0xB2, 0xB2, 0x66, 0xA3, 0x2F, 0x51, 0x51, 0xB2, + 0xB2, 0x2F, 0x51, 0x89, 0x89, 0x2F, 0x8F, 0x2A, + 0xAD, 0xA5, 0x98, 0x66, 0xA3, 0xB2, 0x2F, 0xB2, + 0xD8, 0xB2, 0xA3, 0x98, 0x98, 0x2F, 0xB2, 0xB2, + 0x66, 0xA3, 0xB2, 0x51, 0x51, 0xB2, 0x2F, 0xA3, + 0x51, 0x89, 0x89, 0xA3, 0xA0, 0x2A, 0xA5, 0x8F, + 0x66, 0xA3, 0x2F, 0xB2, 0xB2, 0x51, 0x20, 0x69, + 0x64, 0xF9, 0x3F, 0x52, 0x52, 0x72, 0x29, 0x82, + 0x47, 0x47, 0x47, 0x8B, 0x72, 0xB7, 0x60, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x2F, 0x98, 0x98, 0x2F, + 0xB2, 0xB2, 0xA3, 0xA3, 0xB2, 0x89, 0x51, 0x2F, + 0x2F, 0xA3, 0x51, 0x89, 0x89, 0xA3, 0xA0, 0x2A, + 0xA5, 0x8F, 0x66, 0xA3, 0x2F, 0xB2, 0xB2, 0xB2, + 0xDD, 0xA3, 0x66, 0x98, 0x66, 0x2F, 0xB2, 0xB2, + 0xA3, 0xA3, 0xB2, 0x51, 0xB2, 0x2F, 0xA3, 0x2F, + 0xB2, 0x89, 0xB2, 0x66, 0xA0, 0xA5, 0x8F, 0x98, + 0x66, 0x66, 0xB2, 0x51, 0x51, 0x51, 0x81, 0xFA, + 0x62, 0xEE, 0x30, 0x52, 0x22, 0x72, 0x82, 0x82, + 0x47, 0x47, 0xEA, 0x3F, 0x37, 0x6F, 0x26, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x2A, 0x98, 0x66, 0x2F, + 0x51, 0xB2, 0xA3, 0x66, 0xB2, 0x51, 0x51, 0xB2, + 0xA3, 0x2F, 0xB2, 0x89, 0xB2, 0x66, 0x55, 0x55, + 0x8F, 0x98, 0x66, 0xA3, 0xB2, 0x51, 0x51, 0xB2, + 0x74, 0xA0, 0x8F, 0x98, 0x66, 0xB2, 0xB2, 0xB2, + 0xA3, 0xA3, 0x2F, 0x51, 0x51, 0x2F, 0xA3, 0x2F, + 0xB2, 0x51, 0xA3, 0x98, 0xA0, 0x55, 0xA0, 0xA0, + 0x8F, 0x66, 0x2F, 0x51, 0xB2, 0x51, 0x54, 0xA9, + 0x62, 0xEF, 0x52, 0x22, 0x72, 0x29, 0xEA, 0xEA, + 0x29, 0x22, 0x37, 0x37, 0x8E, 0xCF, 0x49, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6D, 0x2F, 0x66, 0x2F, + 0x51, 0xB2, 0xA3, 0x66, 0x2F, 0xB2, 0xB2, 0x2F, + 0xA3, 0x2F, 0xB2, 0x51, 0x2F, 0x98, 0xA0, 0x55, + 0xA0, 0xA0, 0x8F, 0x66, 0x2F, 0x51, 0xB2, 0xA3, + 0xA3, 0x2A, 0xA5, 0x98, 0xA3, 0x2F, 0xB2, 0x2F, + 0x66, 0x66, 0x2F, 0xB2, 0xB2, 0xB2, 0x2F, 0x2F, + 0xB2, 0x2F, 0xA3, 0x8F, 0xA0, 0xA0, 0xA0, 0xA0, + 0x8F, 0xA3, 0x51, 0x51, 0x2F, 0xB2, 0x54, 0xA8, + 0x65, 0x5C, 0x52, 0x22, 0x29, 0x29, 0x29, 0xB0, + 0x62, 0x56, 0xF9, 0x79, 0xF9, 0xBB, 0x4B, 0x20, + 0x6D, 0xA5, 0x2E, 0x20, 0x20, 0xA3, 0xA3, 0x2F, + 0xB2, 0x2F, 0xA3, 0x66, 0x2F, 0xB2, 0xB2, 0xB2, + 0x2F, 0x2F, 0xB2, 0x2F, 0x66, 0x8F, 0xA0, 0xA0, + 0x55, 0xA0, 0x8F, 0xA3, 0x51, 0x51, 0x2F, 0xA3, + 0xA0, 0x2A, 0x55, 0x66, 0xA3, 0x2F, 0xB2, 0xB2, + 0xA3, 0x66, 0xA3, 0xB2, 0xB2, 0xB2, 0xA3, 0x66, + 0xA3, 0xA3, 0x66, 0x8F, 0x8F, 0x8F, 0xA0, 0x98, + 0xA3, 0x51, 0x89, 0x89, 0xA3, 0x2F, 0x20, 0x54, + 0xDF, 0xFA, 0x40, 0x37, 0xD4, 0x43, 0x56, 0x64, + 0x76, 0xF9, 0x78, 0x41, 0x5E, 0x5E, 0x4C, 0x20, + 0x20, 0xAD, 0x8F, 0x9C, 0x20, 0xA5, 0xA3, 0x2F, + 0x2F, 0x2F, 0xA3, 0x66, 0x2F, 0xB2, 0xB2, 0xB2, + 0xA3, 0x66, 0xA3, 0x2F, 0x66, 0x8F, 0x8F, 0x8F, + 0x8F, 0x8F, 0xA3, 0x51, 0x89, 0x51, 0xA3, 0x66, + 0xA0, 0xA0, 0x8F, 0xA3, 0x2F, 0x2F, 0x2F, 0xB2, + 0x2F, 0xA3, 0x2F, 0xB2, 0x51, 0xB2, 0x2F, 0x66, + 0xA3, 0xA3, 0x66, 0x66, 0x66, 0x66, 0x66, 0xA3, + 0xB2, 0x89, 0xD8, 0x51, 0x66, 0x51, 0x20, 0x6D, + 0x51, 0x77, 0x9F, 0xF7, 0xEE, 0x8E, 0xF9, 0xF0, + 0x24, 0xF7, 0x77, 0x5E, 0x74, 0xD8, 0x98, 0x20, + 0x20, 0x2E, 0x55, 0x92, 0x20, 0x54, 0x51, 0x2F, + 0x2F, 0xB2, 0xB2, 0xA3, 0x2F, 0x51, 0x51, 0xB2, + 0xA3, 0xA3, 0x66, 0xA3, 0x66, 0x66, 0x66, 0x66, + 0x66, 0xA3, 0xB2, 0x89, 0xD8, 0x51, 0xA3, 0x98, + 0x98, 0x66, 0x66, 0xA3, 0x2F, 0x2F, 0x2F, 0xB2, + 0xB2, 0x2F, 0x2F, 0xB2, 0xB2, 0x2F, 0x2F, 0x66, + 0x66, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0xB2, + 0x89, 0xD8, 0x89, 0xB2, 0x66, 0x66, 0x20, 0x6D, + 0x89, 0xC2, 0xA4, 0x96, 0xC6, 0x64, 0x50, 0x40, + 0xF4, 0x97, 0x89, 0x74, 0x7E, 0x6B, 0x39, 0xA7, + 0x20, 0x20, 0x3A, 0x54, 0x20, 0x20, 0xA7, 0x51, + 0x2F, 0xB2, 0xB2, 0xA3, 0xA3, 0xB2, 0xB2, 0xB2, + 0xA3, 0xA3, 0x66, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, + 0x2F, 0xB2, 0x89, 0xD8, 0x44, 0x2F, 0x66, 0x66, + 0x2F, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, 0xB2, + 0x2F, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0xA3, + 0x66, 0xA3, 0x2F, 0xB2, 0xB2, 0xB2, 0x51, 0x51, + 0x89, 0x89, 0xB2, 0x66, 0x2F, 0x6D, 0x20, 0xCE, + 0x39, 0x74, 0x89, 0x5E, 0xBD, 0x87, 0xC8, 0xD1, + 0x89, 0x44, 0x3C, 0x4D, 0x6B, 0x6B, 0x6B, 0x2F, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xA3, + 0x2F, 0x2F, 0x2F, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, + 0x2F, 0xA3, 0x66, 0x66, 0x2F, 0xB2, 0xB2, 0xB2, + 0x51, 0x51, 0x89, 0x89, 0xB2, 0xA3, 0x98, 0x66, + 0xA3, 0x66, 0x66, 0xA3, 0xA3, 0xA3, 0xA3, 0x2F, + 0x2F, 0xA3, 0xA3, 0xA3, 0x2F, 0xA3, 0x2F, 0xA3, + 0x66, 0x66, 0x2F, 0x2F, 0xB2, 0xB2, 0xB2, 0xB2, + 0xB2, 0x2F, 0x66, 0x66, 0x2A, 0x20, 0x54, 0x44, + 0x6B, 0x39, 0x89, 0x89, 0x89, 0x89, 0x89, 0x89, + 0xD8, 0x39, 0x4D, 0x6B, 0x6B, 0x6B, 0x6B, 0x4D, + 0x9C, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6D, + 0x51, 0x2F, 0x2F, 0x2F, 0xA3, 0xA3, 0xA3, 0x2F, + 0xA3, 0xA3, 0x66, 0xA3, 0x2F, 0xB2, 0xB2, 0xB2, + 0xB2, 0xB2, 0xB2, 0x2F, 0x66, 0x98, 0x98, 0x66, + 0x98, 0x98, 0x66, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, + 0x2F, 0x2F, 0xA3, 0xA3, 0x66, 0xA3, 0xA3, 0x66, + 0x98, 0x66, 0x66, 0x2F, 0xA3, 0xA3, 0xA3, 0xA3, + 0x66, 0x98, 0x98, 0x98, 0x3A, 0x54, 0x2A, 0x6B, + 0x6B, 0x6B, 0x83, 0x44, 0x89, 0x89, 0x44, 0x3C, + 0xD6, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, + 0xB2, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0xAD, 0x2F, 0x2F, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, + 0xA3, 0x66, 0x66, 0x98, 0x66, 0xA3, 0xA3, 0xA3, + 0xA3, 0xA3, 0x66, 0x98, 0x8F, 0x8F, 0x8F, 0x98, + 0x8F, 0x98, 0x98, 0x66, 0xA3, 0xA3, 0xA3, 0xA3, + 0x2F, 0xA3, 0xA3, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x8F, 0x8F, 0x8F, 0x98, 0x98, 0x98, 0x8F, 0xA0, + 0xA0, 0xA0, 0xA3, 0xDA, 0x20, 0x3A, 0x39, 0x6B, + 0x6B, 0x6B, 0x4D, 0xA2, 0x74, 0x3C, 0x7E, 0x6B, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, + 0x6B, 0x2E, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x2F, 0x2F, 0xA3, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x98, 0x8F, 0x8F, 0x98, 0x98, 0x98, 0x98, + 0x8F, 0xA0, 0xA0, 0xA0, 0x8F, 0x8F, 0x8F, 0xA0, + 0x8F, 0x66, 0x66, 0xA3, 0x66, 0xA3, 0xA3, 0x2F, + 0x2F, 0x2F, 0xA3, 0xA3, 0x66, 0x66, 0x66, 0x98, + 0x98, 0xA0, 0x98, 0x66, 0x66, 0x98, 0x8F, 0xA0, + 0xA0, 0xA3, 0x2E, 0x20, 0x20, 0x8F, 0x6B, 0x6B, + 0x6B, 0x6B, 0x6B, 0x6B, 0x3D, 0x6B, 0x6B, 0x6B, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, + 0x6B, 0x55, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3A, 0x51, 0x2F, 0xA3, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x98, 0x8F, 0x8F, 0x98, 0x66, 0x98, + 0x8F, 0xA0, 0xA0, 0x8F, 0x8F, 0x8F, 0x8F, 0xA0, + 0x66, 0x2F, 0x2F, 0x2F, 0x2F, 0xA3, 0xA3, 0xA3, + 0x2F, 0x2F, 0xA3, 0xA3, 0x66, 0xA3, 0x66, 0x66, + 0x66, 0x98, 0xA3, 0x2F, 0x2F, 0xA3, 0x66, 0x8F, + 0x66, 0xA6, 0x20, 0x20, 0x6D, 0x39, 0x6B, 0x6B, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, + 0x6B, 0xB2, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x2E, 0x89, 0xA3, 0xA3, 0x66, 0x66, + 0x66, 0x66, 0x98, 0x98, 0xA3, 0x2F, 0x2F, 0xA3, + 0x66, 0x8F, 0x98, 0x98, 0x66, 0x98, 0x98, 0x8F, + 0x2F, 0x51, 0xB2, 0xB2, 0x2F, 0xA3, 0xA3, 0xA3, + 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, + 0xA3, 0xA3, 0x2F, 0xB2, 0x2F, 0xA3, 0x66, 0x2F, + 0x55, 0x20, 0x20, 0x20, 0x4C, 0x39, 0x6B, 0x6B, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, + 0x4D, 0x7E, 0x54, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x2E, 0x51, 0xA3, 0xA3, 0xA3, + 0xA3, 0xA3, 0xA3, 0x2F, 0xB2, 0xB2, 0x2F, 0xA3, + 0x66, 0x66, 0xA3, 0xA3, 0xA3, 0xA3, 0x66, 0x66, + 0xB2, 0x51, 0x51, 0xB2, 0xB2, 0xA3, 0x2F, 0xA3, + 0x2F, 0x2F, 0x2F, 0xA3, 0xA3, 0xA3, 0xA3, 0x66, + 0xA3, 0x2F, 0xB2, 0x2F, 0xA3, 0x98, 0x98, 0xA0, + 0x20, 0x20, 0x20, 0x20, 0xA5, 0x83, 0x6B, 0x6B, + 0x6B, 0x6B, 0x6B, 0x4D, 0x7E, 0x4D, 0x6B, 0x6B, + 0x6B, 0x6B, 0x6B, 0x4D, 0x4D, 0xD6, 0x7E, 0xDD, + 0x3C, 0x39, 0xA7, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x92, 0xB2, 0xA3, 0xA3, + 0xA3, 0x66, 0xA3, 0x2F, 0x2F, 0x2F, 0xA3, 0x98, + 0x98, 0x66, 0xA3, 0xA3, 0x66, 0x66, 0x66, 0xA3, + 0x89, 0x89, 0x51, 0xB2, 0xB2, 0x2F, 0x2F, 0x2F, + 0x2F, 0xA3, 0xA3, 0x2F, 0xA3, 0xA3, 0xA3, 0xA3, + 0xA3, 0xA3, 0xA3, 0x66, 0x8F, 0x8F, 0x2F, 0xDA, + 0x20, 0x20, 0x20, 0xDA, 0xA0, 0x51, 0x3C, 0x7E, + 0x6B, 0x6B, 0x6B, 0x4D, 0x7E, 0x6B, 0x6B, 0x6B, + 0x6B, 0x6B, 0x6B, 0x7E, 0x3C, 0xD8, 0x44, 0xD8, + 0x44, 0x83, 0x89, 0xDA, 0x20, 0x3A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0xB2, 0xA3, 0xA3, + 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0x66, 0x8F, 0x8F, + 0x98, 0x98, 0x98, 0x98, 0x66, 0xA3, 0xA3, 0x2F, + 0x3C, 0x89, 0x89, 0x51, 0xB2, 0xB2, 0x2F, 0x2F, + 0x2F, 0x2F, 0xA3, 0xA3, 0x66, 0x66, 0x66, 0xA3, + 0xA3, 0xA3, 0xA3, 0x66, 0x98, 0x98, 0xA3, 0x20, + 0x20, 0x20, 0x20, 0x6D, 0x2F, 0xE6, 0x6B, 0x6B, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x3D, 0xD6, 0x3D, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x4D, 0x7E, 0xA2, + 0x74, 0x44, 0xA2, 0xA3, 0x20, 0x3A, 0x2E, 0x6D, + 0x20, 0x20, 0x20, 0x20, 0x20, 0xA6, 0xA3, 0x66, + 0x66, 0x66, 0xA3, 0x2F, 0xA3, 0x66, 0x66, 0x98, + 0x66, 0x66, 0x98, 0x98, 0x98, 0x66, 0xA3, 0xA3, + 0x83, 0xB2, 0x2F, 0x2F, 0xB2, 0xB2, 0xB2, 0x2F, + 0x2F, 0x2F, 0xA3, 0x66, 0x66, 0x98, 0x98, 0x66, + 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0x66, 0xA6, 0x20, + 0x3A, 0x3A, 0x54, 0x55, 0x7E, 0x6B, 0x6B, 0x6B, + 0x4D, 0x3D, 0x6B, 0x6B, 0x6B, 0x57, 0x33, 0xEB, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, + 0x4D, 0xA2, 0x74, 0x39, 0x92, 0x20, 0x20, 0x6D, + 0x2E, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2F, 0x98, + 0x98, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0xA3, 0x66, 0xA3, + 0x89, 0xA3, 0x66, 0x66, 0xA3, 0xA3, 0x2F, 0x2F, + 0xA3, 0x2F, 0xA3, 0xA3, 0x66, 0x66, 0x66, 0xA3, + 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xB2, 0x3A, 0x20, + 0xA7, 0x20, 0x3A, 0x39, 0x6B, 0x6B, 0x6B, 0x6B, + 0xB5, 0xCB, 0x6B, 0x6B, 0x3D, 0x8A, 0x42, 0x3D, + 0x6B, 0x6B, 0x6B, 0x84, 0x6C, 0x4D, 0x6B, 0x6B, + 0x6B, 0x6B, 0x7E, 0x83, 0x51, 0x20, 0x20, 0x20, + 0x6D, 0x3A, 0x20, 0x20, 0x20, 0x20, 0xAD, 0x66, + 0x66, 0x66, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, + 0xA3, 0xA3, 0xA3, 0xA3, 0x66, 0xA3, 0xA3, 0xA3, + 0xB2, 0x98, 0x66, 0x66, 0x98, 0x66, 0x66, 0xA3, + 0xA3, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, + 0xA3, 0x2F, 0xA3, 0xA3, 0xA3, 0x2F, 0x20, 0x6D, + 0x3A, 0x20, 0x98, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, + 0xAA, 0x33, 0x6B, 0x6B, 0x3D, 0xF5, 0x7B, 0x3D, + 0x6B, 0x6B, 0x4F, 0x4A, 0x58, 0x3D, 0x6B, 0x6B, + 0x6B, 0x6B, 0x6B, 0x7E, 0x7E, 0x9C, 0x54, 0xA7, + 0x2E, 0xA7, 0x20, 0x20, 0x20, 0x20, 0x54, 0x51, + 0x2F, 0x2F, 0xA3, 0x2F, 0xA3, 0xA3, 0xA3, 0xA3, + 0x2F, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0x2F, + 0xB2, 0x66, 0x66, 0x66, 0x66, 0xA3, 0x66, 0xA3, + 0x66, 0x66, 0xA3, 0x2F, 0x2F, 0xB2, 0x2F, 0xB2, + 0x2F, 0x2F, 0x2F, 0xA3, 0x2F, 0xA6, 0x20, 0xCE, + 0x20, 0x6D, 0x4D, 0x6B, 0xD6, 0x7E, 0x6B, 0x6B, + 0x6E, 0x9A, 0x57, 0x6B, 0x2D, 0x7B, 0x7B, 0x3D, + 0x6B, 0x84, 0xF5, 0x7B, 0x84, 0x6B, 0x6B, 0x6B, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x98, 0x3A, 0x9C, + 0xCE, 0x3A, 0x2E, 0x20, 0x20, 0x20, 0x20, 0x98, + 0xB2, 0xB2, 0x2F, 0x2F, 0x2F, 0xA3, 0x2F, 0x2F, + 0x2F, 0xA3, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, + 0x89, 0xA3, 0x66, 0x66, 0xA3, 0x2F, 0x2F, 0xA3, + 0x66, 0x66, 0xA3, 0xA3, 0x2F, 0x2F, 0xB2, 0xB2, + 0xB2, 0x2F, 0x2F, 0x2F, 0x89, 0x54, 0x6D, 0x3A, + 0x20, 0x98, 0x6B, 0x6B, 0xE0, 0xB4, 0x6B, 0x6B, + 0x2D, 0x9E, 0x4A, 0x3D, 0x84, 0xF5, 0xF5, 0x84, + 0x6B, 0x6E, 0x59, 0x6C, 0x6B, 0x6B, 0x6B, 0x6B, + 0x3D, 0x6B, 0x6B, 0x6B, 0x6B, 0xDD, 0xDA, 0x6D, + 0x54, 0x20, 0xCE, 0x20, 0x20, 0x20, 0x20, 0xA7, + 0x51, 0xB2, 0xB2, 0xB2, 0x2F, 0xB2, 0x2F, 0x2F, + 0x2F, 0x66, 0x66, 0xA3, 0xA3, 0xA3, 0xA3, 0x66, + 0x89, 0xA3, 0xA3, 0xA3, 0x2F, 0xB2, 0xB2, 0x2F, + 0x66, 0x66, 0xA3, 0xA3, 0x2F, 0xA3, 0xA3, 0x2F, + 0xB2, 0x2F, 0x2F, 0xA3, 0x98, 0x20, 0xA7, 0x20, + 0x3A, 0x7E, 0x6B, 0x6B, 0x7F, 0xDE, 0xF6, 0x3D, + 0x6B, 0xDB, 0x8A, 0xDB, 0xE9, 0xF3, 0xF3, 0xDB, + 0x68, 0xF3, 0x73, 0x7F, 0x6B, 0x6B, 0x57, 0x58, + 0xDC, 0x2D, 0x6B, 0x6B, 0x6B, 0x6B, 0x3A, 0x20, + 0x20, 0x20, 0x6D, 0x54, 0x20, 0x20, 0x20, 0x20, + 0x51, 0x2F, 0x2F, 0x2F, 0xA3, 0xA3, 0xA3, 0x66, + 0xA3, 0x66, 0x98, 0x98, 0x66, 0x98, 0x98, 0x66, + 0x2F, 0x66, 0x66, 0xA3, 0x2F, 0xB2, 0x2F, 0xA3, + 0xA3, 0xA3, 0xA3, 0xA3, 0x66, 0xA3, 0xA3, 0xA3, + 0x66, 0x98, 0x8F, 0x98, 0xCE, 0xDA, 0x2E, 0x20, + 0x2A, 0x6B, 0x6B, 0x6B, 0x6B, 0x2C, 0x34, 0xCB, + 0xEB, 0x6C, 0x31, 0x59, 0x82, 0x82, 0x8B, 0x82, + 0xF3, 0x73, 0xE9, 0x6B, 0x3D, 0x6E, 0xF3, 0x4A, + 0x4F, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x92, 0x20, + 0x20, 0x20, 0x6D, 0x6D, 0x20, 0x20, 0x20, 0x20, + 0xA3, 0xA3, 0x66, 0x98, 0x98, 0x8F, 0x8F, 0x98, + 0x98, 0x98, 0x98, 0x66, 0x98, 0x66, 0x66, 0xA3, + 0xA3, 0x66, 0x66, 0x66, 0xA3, 0x2F, 0x2F, 0xA3, + 0xA3, 0xA3, 0x66, 0x66, 0xA3, 0xA3, 0xA3, 0x66, + 0x8F, 0x55, 0xA5, 0x98, 0x20, 0x2E, 0x54, 0x54, + 0x89, 0x6B, 0x6B, 0x6B, 0x6B, 0x84, 0xE3, 0x4A, + 0x58, 0x42, 0x5B, 0x8B, 0x82, 0x82, 0x82, 0x82, + 0x82, 0x59, 0x58, 0x57, 0x57, 0x59, 0x7B, 0x84, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0xAD, 0x20, + 0x20, 0x20, 0x3A, 0x3A, 0x20, 0x20, 0x20, 0x20, + 0x2A, 0x66, 0x8F, 0x55, 0xA5, 0xA5, 0xA0, 0x8F, + 0x66, 0xA3, 0xA3, 0x66, 0x98, 0x66, 0x66, 0x2F, + 0x2F, 0x2F, 0x2F, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, + 0xA3, 0x2F, 0xA3, 0xA3, 0x66, 0xA3, 0xA3, 0x66, + 0x8F, 0xA5, 0x8F, 0x2E, 0x20, 0x2E, 0x20, 0x3A, + 0x4D, 0x6B, 0xE6, 0x84, 0x3D, 0x6B, 0xEB, 0x4A, + 0xC9, 0x8B, 0x8B, 0x31, 0x59, 0x82, 0x59, 0x59, + 0x5B, 0x82, 0x59, 0x73, 0x7B, 0xDC, 0x57, 0x6B, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x55, 0x20, + 0x20, 0x20, 0x6D, 0xDA, 0x20, 0x20, 0x20, 0x20, + 0x9C, 0x66, 0x8F, 0xA5, 0xA5, 0x55, 0x8F, 0x66, + 0x2F, 0xB2, 0x2F, 0x66, 0x98, 0x98, 0x2F, 0x51, + 0x89, 0xB2, 0x2F, 0xA3, 0xA3, 0xB2, 0xB2, 0xB2, + 0x2F, 0x2F, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0x66, + 0x8F, 0xA5, 0x8F, 0x20, 0x20, 0xA7, 0x20, 0xA6, + 0x6B, 0x6B, 0xE4, 0x48, 0x2C, 0xDB, 0x4F, 0x9E, + 0xD0, 0xD0, 0x8B, 0x82, 0x82, 0x82, 0x82, 0x82, + 0x59, 0x82, 0x82, 0x73, 0x7B, 0x68, 0x6B, 0x3D, + 0x68, 0x68, 0x84, 0x3D, 0x6B, 0x6B, 0xA0, 0x20, + 0x20, 0x20, 0x6D, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6D, 0x2F, 0xA0, 0xA5, 0x55, 0x98, 0x66, 0xA3, + 0xB2, 0x89, 0xB2, 0x98, 0x8F, 0x98, 0x2F, 0x51, + 0x74, 0xB2, 0xA3, 0xA3, 0x2F, 0x2F, 0xB2, 0x2F, + 0xA3, 0xA3, 0xA3, 0x66, 0x66, 0xA3, 0x2F, 0xA3, + 0x98, 0xA3, 0x6D, 0x20, 0x20, 0xCE, 0x20, 0x2A, + 0x6B, 0x6B, 0xEB, 0x2C, 0xE1, 0xF1, 0x7C, 0xD0, + 0x8B, 0x8B, 0x82, 0x82, 0x82, 0x82, 0x82, 0x59, + 0x82, 0x82, 0x42, 0x82, 0x31, 0x57, 0x4F, 0x7B, + 0x7B, 0xF5, 0xF6, 0xDB, 0x6B, 0x6B, 0x98, 0x20, + 0x20, 0x20, 0x2E, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x51, 0x66, 0xA0, 0xA0, 0x66, 0x2F, 0xB2, + 0xB2, 0x51, 0x2F, 0xA0, 0x55, 0xA3, 0x51, 0x89, + 0x44, 0xA3, 0x98, 0x98, 0x2F, 0x2F, 0x2F, 0xA3, + 0xA3, 0x66, 0x98, 0x98, 0x98, 0xA3, 0x2F, 0x2F, + 0x98, 0x8F, 0x20, 0x20, 0x3A, 0xA6, 0x20, 0xA0, + 0x6B, 0x6B, 0x6B, 0x6B, 0x7F, 0x7F, 0xC3, 0xC9, + 0xD0, 0xD0, 0x29, 0x59, 0x82, 0x73, 0x82, 0x73, + 0x59, 0x59, 0x59, 0x59, 0x59, 0x58, 0xAF, 0xF5, + 0x8A, 0x68, 0xEB, 0x6B, 0x6B, 0x6B, 0x98, 0x20, + 0x20, 0x20, 0x6D, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x51, 0x98, 0x55, 0xA0, 0xA3, 0xB2, 0x51, + 0x51, 0x2F, 0x98, 0x55, 0x8F, 0xB2, 0x89, 0x44, + 0xA3, 0x55, 0x55, 0x98, 0xA3, 0xB2, 0x2F, 0xA3, + 0x66, 0x66, 0x98, 0x8F, 0x66, 0xA3, 0x66, 0x98, + 0x55, 0x4C, 0x20, 0x20, 0xDA, 0xAD, 0x20, 0x98, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x3D, 0x9A, 0xD0, + 0xF2, 0x8B, 0x8B, 0x8B, 0x73, 0x82, 0x5B, 0x82, + 0x82, 0x59, 0x59, 0x73, 0x73, 0x58, 0x3D, 0x3D, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x66, 0x20, + 0x20, 0x3A, 0x3A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x2F, 0x55, 0xA5, 0x8F, 0xA3, 0x51, 0x51, + 0xB2, 0xA3, 0x66, 0x66, 0xA3, 0xB2, 0x89, 0x51, + 0x98, 0xA5, 0x55, 0x8F, 0x2F, 0xB2, 0xB2, 0xA3, + 0x66, 0x66, 0x98, 0x98, 0x98, 0x66, 0x66, 0x8F, + 0x8F, 0x92, 0x20, 0x20, 0x20, 0x6D, 0x6D, 0xA3, + 0x6B, 0x6B, 0xEB, 0x7F, 0x4F, 0xDB, 0xD2, 0xC9, + 0xC9, 0xD0, 0x8B, 0x8B, 0x73, 0x82, 0x59, 0x8B, + 0x59, 0x82, 0x59, 0x59, 0x73, 0xF5, 0xEB, 0x6B, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x55, 0x20, + 0x20, 0xA7, 0x54, 0xDA, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x98, 0xA0, 0x8F, 0xA3, 0xB2, 0x51, 0x51, + 0x51, 0x2F, 0xA3, 0xA3, 0xB2, 0xB2, 0x51, 0xB2, + 0xA0, 0xA5, 0x55, 0x66, 0x2F, 0x51, 0x2F, 0xA3, + 0x66, 0x66, 0x66, 0x98, 0x66, 0x66, 0x98, 0x98, + 0x98, 0x2A, 0x54, 0x95, 0x95, 0x71, 0x2E, 0x98, + 0x6B, 0x6B, 0x4D, 0x28, 0xDE, 0x88, 0xB7, 0x70, + 0xC9, 0xC9, 0xD0, 0xF2, 0x8B, 0x8B, 0x8B, 0x59, + 0x59, 0x59, 0x59, 0x5B, 0x59, 0xF3, 0x57, 0xE9, + 0xDB, 0x84, 0x6B, 0x6B, 0x6B, 0x6B, 0x4C, 0xDA, + 0x2E, 0xDA, 0x20, 0xDA, 0x2E, 0x2E, 0x6D, 0x20, + 0x4C, 0x98, 0x66, 0xA3, 0x2F, 0xB2, 0x51, 0x51, + 0xB2, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, + 0xA0, 0xA0, 0x8F, 0x2F, 0xB2, 0x89, 0xB2, 0xA3, + 0x66, 0x66, 0x98, 0x66, 0x66, 0x66, 0x66, 0xA3, + 0x2F, 0xD1, 0xE2, 0x52, 0x52, 0xF4, 0xBF, 0x9C, + 0x39, 0x6B, 0x6B, 0x6B, 0x7F, 0x4F, 0xE3, 0x6A, + 0xD0, 0xC9, 0xC9, 0xD0, 0xD0, 0x8B, 0x8B, 0x82, + 0x5B, 0x5B, 0x73, 0x8B, 0x59, 0x23, 0x6E, 0x31, + 0x59, 0x7B, 0xDB, 0x84, 0x68, 0x7F, 0xAE, 0x54, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x54, 0xA6, 0x3A, + 0xA0, 0xA3, 0xA3, 0x2F, 0x51, 0x51, 0x51, 0xB2, + 0x2F, 0xA3, 0x66, 0x66, 0xA3, 0xA3, 0xA3, 0xA3, + 0x8F, 0x8F, 0x66, 0x2F, 0x51, 0x51, 0xB2, 0xA3, + 0x66, 0x98, 0x98, 0x66, 0x66, 0xA3, 0x2F, 0x2F, + 0x3C, 0x88, 0x8D, 0x52, 0x52, 0x5D, 0xF7, 0xBF, + 0xCE, 0xA2, 0x6B, 0x6B, 0x6B, 0x6B, 0x7F, 0x85, + 0x70, 0xC9, 0xC9, 0xC9, 0xD0, 0xEA, 0x8B, 0x5B, + 0x82, 0xEA, 0x82, 0x82, 0x42, 0x57, 0x3D, 0x68, + 0x68, 0x57, 0x4A, 0x34, 0x22, 0xCC, 0x21, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0xDA, 0xA7, 0x6D, + 0xDF, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0x2F, 0x2F, + 0xA3, 0x66, 0x66, 0x66, 0xA3, 0xA3, 0x2F, 0x2F, + 0x66, 0x66, 0xA3, 0x2F, 0xB2, 0xB2, 0x2F, 0x66, + 0x8F, 0x8F, 0x8F, 0x98, 0xA3, 0xA3, 0x89, 0xD8, + 0x25, 0x5C, 0x3B, 0x5D, 0x52, 0x80, 0x70, 0x36, + 0x71, 0xA7, 0x44, 0x6B, 0x84, 0xCB, 0xAA, 0xF3, + 0xC9, 0xC9, 0xC9, 0xC9, 0xD0, 0x8B, 0x5B, 0x5B, + 0x5B, 0xEA, 0x82, 0x47, 0x7B, 0x68, 0x3D, 0x3D, + 0x6B, 0x3D, 0x6C, 0x2B, 0x80, 0x61, 0x96, 0x81, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3A, 0xDA, 0x63, + 0xAC, 0x6C, 0xB2, 0xB2, 0xB2, 0xB2, 0x2F, 0xA3, + 0xA3, 0x66, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, + 0x66, 0x98, 0x66, 0xA3, 0xB2, 0xB2, 0x2F, 0x66, + 0x8F, 0x8F, 0x2F, 0xD8, 0xE4, 0xCD, 0xAA, 0xB4, + 0x78, 0x2B, 0x3B, 0x70, 0x46, 0x5D, 0x5D, 0x52, + 0x9D, 0x81, 0x3A, 0xA3, 0xCD, 0x48, 0xBE, 0x4F, + 0xC3, 0xC9, 0xD0, 0xD0, 0xD0, 0xEA, 0x5B, 0x8B, + 0x5B, 0x82, 0x8B, 0x59, 0x4A, 0xF3, 0x33, 0x7F, + 0x3D, 0x6B, 0x4F, 0x6F, 0x5D, 0x52, 0x63, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x85, + 0x72, 0xDC, 0xD8, 0x2F, 0xA3, 0x2F, 0xA3, 0xA3, + 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, + 0xA3, 0x98, 0x66, 0x2F, 0xB2, 0x51, 0xA3, 0x98, + 0xA0, 0xA3, 0x93, 0xCF, 0x79, 0x27, 0x5C, 0x79, + 0x2B, 0x30, 0x80, 0x80, 0x5D, 0x5D, 0x5D, 0x5D, + 0x3F, 0x69, 0x20, 0x20, 0x2A, 0xD6, 0x3D, 0x6B, + 0x84, 0xE3, 0x34, 0xB7, 0xC9, 0xD0, 0xD0, 0xF2, + 0xD0, 0x8B, 0x31, 0x68, 0x68, 0x6E, 0x31, 0x33, + 0x7F, 0x7E, 0xA1, 0x6F, 0x52, 0x8D, 0xE5, 0xBF, + 0x20, 0x20, 0x20, 0x20, 0x81, 0xA8, 0x78, 0x52, + 0x52, 0xD2, 0xD8, 0xA3, 0xA3, 0x2F, 0x2F, 0xA3, + 0xA3, 0x66, 0x98, 0x98, 0x98, 0x98, 0x98, 0x66, + 0x51, 0x66, 0x2F, 0x51, 0x51, 0xB2, 0xA3, 0xA0, + 0xA0, 0x44, 0x78, 0xEF, 0x52, 0x30, 0x30, 0x30, + 0x3B, 0x70, 0x5D, 0x5D, 0x5D, 0x80, 0x5D, 0x5D, + 0x46, 0xC1, 0x71, 0x20, 0x81, 0xB1, 0xDD, 0x3D, + 0xA1, 0xE7, 0xDB, 0xCA, 0xD2, 0x6A, 0x6A, 0x6A, + 0xF3, 0xE9, 0xDB, 0x8A, 0x84, 0x3D, 0x84, 0xDC, + 0x25, 0x44, 0xB5, 0xEE, 0x30, 0xEF, 0xF0, 0x32, + 0x69, 0x5F, 0x4B, 0xA8, 0x99, 0x56, 0x67, 0x30, + 0x30, 0x34, 0xB2, 0x2F, 0xA3, 0xA3, 0x66, 0x66, + 0x98, 0x8F, 0x98, 0x98, 0x66, 0x66, 0x66, 0x66, + 0x51, 0x2F, 0xB2, 0x51, 0x51, 0x2F, 0x66, 0xA0, + 0x8F, 0xE0, 0xF9, 0x8D, 0x52, 0x5D, 0x46, 0x5D, + 0x80, 0x5D, 0x80, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, + 0x52, 0x52, 0x60, 0x81, 0x20, 0x20, 0x6D, 0xD1, + 0x48, 0xE7, 0x6B, 0x33, 0xF6, 0x7F, 0x7F, 0xDB, + 0x84, 0x6B, 0x6C, 0x6A, 0xF3, 0xEB, 0x6B, 0x3D, + 0x4F, 0xD8, 0xCD, 0x79, 0x30, 0x67, 0xF9, 0x24, + 0xED, 0xD9, 0x8C, 0xED, 0x37, 0x2B, 0x3B, 0x5D, + 0x80, 0x85, 0x4E, 0x98, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, + 0x51, 0x2F, 0xB2, 0xB2, 0xB2, 0xA3, 0x8F, 0x8F, + 0x98, 0xE0, 0xF0, 0x67, 0x5D, 0x80, 0x80, 0x5D, + 0x5D, 0x5D, 0x5D, 0x5D, 0x80, 0x5D, 0x5D, 0x5D, + 0x5D, 0x70, 0x27, 0x4B, 0x20, 0x81, 0x71, 0x3A, + 0xB5, 0xEB, 0x3D, 0xF1, 0xE1, 0x84, 0x84, 0xF1, + 0xE3, 0x3D, 0x6B, 0x6C, 0x34, 0xE7, 0x6B, 0x6B, + 0xD6, 0x74, 0x5E, 0x78, 0x67, 0x30, 0xEE, 0x5C, + 0xF9, 0xF9, 0x45, 0x5C, 0x2B, 0x3B, 0x5D, 0x5D, + 0x5D, 0x5D, 0xF8, 0x44, 0x66, 0x66, 0x66, 0x66, + 0x2F, 0x2F, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, + 0xB2, 0x2F, 0xA3, 0xA3, 0xA3, 0x98, 0x8F, 0x98, + 0x66, 0x83, 0x76, 0x67, 0x30, 0x80, 0x5D, 0x80, + 0x5D, 0x5D, 0x80, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, + 0x80, 0x5D, 0x22, 0xFA, 0x20, 0x81, 0x20, 0x20, + 0xA5, 0x6B, 0x6B, 0xE8, 0xBE, 0x3D, 0x6B, 0x2C, + 0xE1, 0xEB, 0x6B, 0x3D, 0x3E, 0xA1, 0x6B, 0x6B, + 0x4D, 0x74, 0xE8, 0x62, 0x67, 0x30, 0x8D, 0x67, + 0xEE, 0xEE, 0xEE, 0x67, 0x30, 0x80, 0x5D, 0x5D, + 0x52, 0x5D, 0x85, 0xAC, 0x3E, 0xA3, 0x66, 0x66, + 0x2F, 0x51, 0x51, 0x51, 0x51, 0xB2, 0x2F, 0x2F, + 0x2F, 0xA3, 0xA3, 0x66, 0x98, 0x8F, 0x8F, 0x66, + 0x2F, 0x83, 0xBC, 0xEE, 0x5D, 0x5D, 0x5D, 0x5D, + 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x80, 0x5D, 0x5D, + 0x5D, 0x5D, 0x22, 0xB0, 0xAE, 0x81, 0x20, 0x20, + 0x4C, 0x3D, 0xEB, 0x39, 0x57, 0x6B, 0x6B, 0x3E, + 0x97, 0x3D, 0x6B, 0x3D, 0x6B, 0x6B, 0x6B, 0x6B, + 0x3D, 0x3C, 0xBA, 0x62, 0xEE, 0x5D, 0x5D, 0x30, + 0x30, 0x8D, 0x8D, 0x30, 0x52, 0x5D, 0x5D, 0x80, + 0x5D, 0x5D, 0x5D, 0x85, 0xB0, 0x6E, 0x2F, 0x66, + 0x2F, 0xB2, 0x51, 0xB2, 0x2F, 0x2F, 0xA3, 0xA3, + 0xB2, 0xA3, 0x66, 0x98, 0x98, 0x8F, 0x98, 0xA3, + 0x2F, 0x51, 0xDE, 0x8E, 0x30, 0x5D, 0x5D, 0x5D, + 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, + 0x52, 0x80, 0x5D, 0x22, 0x43, 0x4B, 0x20, 0x6D, + 0x44, 0x6B, 0x6B, 0x3D, 0x6B, 0x6B, 0x6B, 0x4D, + 0x3D, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x3D, 0x6B, + 0x4D, 0x2A, 0xAE, 0x76, 0xEE, 0x30, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x5D, 0x5D, 0x5D, 0x80, + 0x5D, 0x5D, 0x80, 0x80, 0x5D, 0x7A, 0xB6, 0x51, + 0xB2, 0xB2, 0xB2, 0xA3, 0x66, 0x66, 0x66, 0xA3, + 0x2F, 0x66, 0x98, 0x8F, 0xA0, 0x98, 0xA3, 0x2F, + 0x2F, 0x51, 0xAB, 0x8E, 0x5D, 0x5D, 0x5D, 0x5D, + 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x80, + 0x5D, 0x80, 0x5D, 0x52, 0x52, 0x94, 0x2F, 0x7E, + 0x6B, 0x3D, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x7E, + 0xAD, 0x54, 0xAE, 0x24, 0x2B, 0x3B, 0x5D, 0x52, + 0x5D, 0x5D, 0x5D, 0x5D, 0x80, 0x5D, 0x5D, 0x80, + 0x5D, 0x52, 0x52, 0x5D, 0x5D, 0x5D, 0xD2, 0x3E, + 0x89, 0x89, 0xB2, 0xA3, 0x66, 0x98, 0x66, 0x66, + 0x2F, 0x66, 0x8F, 0x8F, 0xA0, 0x98, 0xA3, 0xB2, + 0x2F, 0x51, 0xDE, 0x79, 0x5D, 0x80, 0x5D, 0x5D, + 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, + 0x5D, 0x5D, 0x80, 0x5D, 0x52, 0x6F, 0xA4, 0x6B, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x4D, 0xA2, 0xCE, + 0x20, 0x20, 0x95, 0x24, 0x67, 0x3B, 0x80, 0x80, + 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, + 0x80, 0x5D, 0x5D, 0x5D, 0x5D, 0x30, 0xB0, 0x86, + 0x89, 0x51, 0x2F, 0x66, 0x98, 0x98, 0xA3, 0xA3, + 0xA3, 0x66, 0x8F, 0xA0, 0x8F, 0x66, 0x2F, 0xB2, + 0x2F, 0x4E, 0x76, 0x2B, 0x30, 0x5D, 0x5D, 0x5D, + 0x80, 0x80, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, + 0x80, 0x5D, 0x5D, 0x5D, 0x46, 0x52, 0x21, 0x74, + 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, 0x6B, + 0x6B, 0x6B, 0x6B, 0x6B, 0x7E, 0x98, 0x3A, 0x20, + 0x20, 0x81, 0x60, 0xED, 0x2B, 0x52, 0x5D, 0x5D, + 0x80, 0x5D, 0x5D, 0x80, 0x5D, 0x5D, 0x5D, 0x80, + 0x22, 0x5D, 0x5D, 0x5D, 0x8D, 0x2B, 0x38, 0x39, + 0x51, 0x66, 0x8F, 0xA0, 0xA0, 0x8F, 0x98, 0x66, + 0x66, 0x66, 0x8F, 0x55, 0x8F, 0xA3, 0xB2, 0xB2, + 0xA3, 0xE8, 0xF9, 0x30, 0x3B, 0x80, 0x5D, 0x5D, + 0x5D, 0x80, 0x80, 0x5D, 0x5D, 0x5D, 0x80, 0x5D, + 0x5D, 0x5D, 0x5D, 0x5D, 0x52, 0x30, 0xD4, 0x99, + 0x51, 0x4D, 0x6B, 0x6B, 0x6B, 0x6B, 0x4D, 0x6B, + 0x6B, 0x6B, 0x7E, 0xA3, 0x2E, 0x20, 0x20, 0x20, + 0x20, 0x81, 0xC5, 0xED, 0x2B, 0x3B, 0x5D, 0x5D, + 0x5D, 0x5D, 0x5D, 0x5D, 0x80, 0x5D, 0x5D, 0x80, + 0x5D, 0x52, 0x52, 0x6F, 0xDE, 0x2C, 0x39, 0x51, + 0x66, 0xA0, 0xA5, 0xA5, 0x55, 0x8F, 0x66, 0x66, + 0xA0, 0xA0, 0xA0, 0xA0, 0x8F, 0xA3, 0x2F, 0x2F, + 0x51, 0xD5, 0x45, 0x8D, 0x3B, 0x5D, 0x80, 0x5D, + 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, 0x5D, + 0x80, 0x5D, 0x5D, 0x5D, 0x52, 0x67, 0x37, 0xA9, + 0x3A, 0xCE, 0xA0, 0x2F, 0x51, 0x51, 0xB2, 0xA3, + 0xA5, 0x9C, 0x54, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x54, 0x99, 0xED, 0x67, 0x30, 0x5D, 0x5D, + 0x5D, 0x80, 0x5D, 0x5D, 0x5D, 0x5D, 0x3B, 0x80, + 0x8D, 0x79, 0x48, 0x2C, 0x39, 0x44, 0xB2, 0x66, + 0xA0, 0x2A, 0xA5, 0xA0, 0x8F, 0x66, 0xA3, 0xA3, + 0xA0, 0x8F, 0x8F, 0xA0, 0x8F, 0xA3, 0xB2, 0xB2, + 0xD8, 0xBC, 0x45, 0xEE, 0x67, 0x8D, 0x30, 0x30, + 0x52, 0x52, 0x80, 0x5D, 0x5D, 0x5D, 0x5D, 0x80, + 0x5D, 0x5D, 0x5D, 0x80, 0x3B, 0x67, 0xF9, 0x32, + 0x69, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0xBF, 0xEC, 0xED, 0x2B, 0x30, 0x5D, 0x5D, + 0x80, 0x5D, 0x5D, 0x5D, 0x52, 0x30, 0x67, 0x2B, + 0xCF, 0xAA, 0xD8, 0x89, 0x89, 0x51, 0x66, 0x55, + 0x2A, 0x2A, 0xA5, 0x8F, 0x66, 0xA3, 0x2F, 0x2F, + 0xA3, 0xA3, 0x66, 0x98, 0x98, 0x2F, 0xB2, 0x2F, + 0xD1, 0x28, 0x56, 0xED, 0x62, 0x37, 0x5C, 0x79, + 0x8E, 0x2B, 0x2B, 0x30, 0x30, 0x30, 0x5D, 0x5D, + 0x5D, 0x5D, 0x5D, 0x80, 0x3B, 0xEE, 0x56, 0xA9, + 0x75, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5F, 0x99, 0xD9, 0x45, 0x8D, 0x3B, 0x5D, + 0x5D, 0x3B, 0x5D, 0x8D, 0x2B, 0x79, 0x79, 0x41, + 0x83, 0xB2, 0xB2, 0x89, 0x89, 0x2F, 0xA0, 0x2A, + 0xAD, 0xA5, 0x98, 0x66, 0xA3, 0xB2, 0x2F, 0xB2, + 0xD8, 0xB2, 0xA3, 0x98, 0x98, 0x2F, 0x51, 0xB2, + 0xA3, 0x83, 0x3E, 0x25, 0xD5, 0xE5, 0x50, 0x8C, + 0xED, 0x24, 0x24, 0xF0, 0x45, 0x8E, 0x2B, 0x30, + 0x30, 0x5D, 0x3B, 0x30, 0xEE, 0xF0, 0xC6, 0x65, + 0x75, 0x71, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x2B, 0x2B, 0x2A, 0x2A, 0x2A, 0x2A, 0x2B, - 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, - 0x27, 0x27, 0x27, 0x27, 0x32, 0x33, 0x34, 0x35, - 0x36, 0x27, 0x27, 0x33, 0x25, 0x25, 0x24, 0x24, - 0x24, 0x24, 0x23, 0x21, 0x20, 0x20, 0x2B, 0x2A, - 0x28, 0x29, 0x29, 0x37, 0x2C, 0x2C, 0x29, 0x28, - 0x2A, 0x2B, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2B, 0x2B, - 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, 0x2A, 0x2B, 0x27, - 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, - 0x27, 0x27, 0x27, 0x27, 0x2F, 0x32, 0x36, 0x27, - 0x27, 0x27, 0x27, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x33, 0x25, 0x25, 0x24, 0x23, 0x21, - 0x20, 0x2B, 0x2A, 0x29, 0x29, 0x2C, 0x2C, 0x2C, - 0x29, 0x28, 0x2A, 0x2B, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2B, 0x2B, - 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, 0x20, 0x21, 0x27, - 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, - 0x27, 0x27, 0x27, 0x27, 0x38, 0x27, 0x27, 0x27, - 0x27, 0x27, 0x27, 0x27, 0x23, 0x23, 0x24, 0x24, - 0x25, 0x25, 0x33, 0x33, 0x33, 0x33, 0x33, 0x25, - 0x24, 0x22, 0x20, 0x20, 0x2A, 0x28, 0x29, 0x2C, - 0x2C, 0x2C, 0x29, 0x28, 0x2A, 0x2B, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x2B, 0x2B, 0x2B, 0x2B, - 0x2B, 0x2B, 0x2B, 0x20, 0x21, 0x22, 0x23, 0x27, - 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, - 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, - 0x27, 0x27, 0x27, 0x27, 0x2A, 0x2A, 0x2B, 0x2B, - 0x20, 0x21, 0x22, 0x24, 0x20, 0x39, 0x39, 0x39, - 0x39, 0x39, 0x3A, 0x3B, 0x22, 0x20, 0x2A, 0x28, - 0x29, 0x2C, 0x2C, 0x2C, 0x29, 0x28, 0x2B, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, 0x2B, - 0x2B, 0x20, 0x21, 0x22, 0x22, 0x23, 0x24, 0x27, - 0x27, 0x27, 0x3C, 0x36, 0x3C, 0x27, 0x27, 0x27, - 0x27, 0x27, 0x27, 0x3D, 0x3E, 0x32, 0x27, 0x27, - 0x27, 0x27, 0x27, 0x27, 0x3D, 0x39, 0x3F, 0x3F, - 0x39, 0x2C, 0x20, 0x20, 0x39, 0x39, 0x39, 0x39, - 0x39, 0x39, 0x39, 0x40, 0x40, 0x41, 0x22, 0x20, - 0x2A, 0x28, 0x2C, 0x2C, 0x2C, 0x29, 0x29, 0x2A, - 0x2B, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x2B, 0x2B, 0x2B, 0x2B, 0x20, 0x20, - 0x21, 0x22, 0x22, 0x22, 0x23, 0x23, 0x22, 0x27, - 0x27, 0x3C, 0x3C, 0x3D, 0x42, 0x3C, 0x27, 0x27, - 0x3C, 0x27, 0x3C, 0x43, 0x44, 0x36, 0x42, 0x27, - 0x27, 0x27, 0x27, 0x27, 0x3D, 0x28, 0x29, 0x2C, - 0x2C, 0x45, 0x20, 0x39, 0x39, 0x39, 0x39, 0x39, - 0x39, 0x46, 0x40, 0x47, 0x40, 0x47, 0x3A, 0x40, - 0x22, 0x20, 0x2A, 0x29, 0x2C, 0x2C, 0x2C, 0x29, - 0x28, 0x2B, 0x2B, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x2B, 0x2B, 0x2B, 0x2B, 0x20, 0x20, 0x22, - 0x22, 0x22, 0x23, 0x22, 0x22, 0x21, 0x20, 0x27, - 0x27, 0x44, 0x28, 0x24, 0x27, 0x2F, 0x3C, 0x27, - 0x27, 0x38, 0x24, 0x2C, 0x2C, 0x48, 0x49, 0x36, - 0x27, 0x27, 0x27, 0x27, 0x27, 0x28, 0x29, 0x29, - 0x4A, 0x20, 0x3A, 0x40, 0x47, 0x40, 0x47, 0x40, - 0x40, 0x47, 0x40, 0x40, 0x39, 0x39, 0x39, 0x4A, - 0x25, 0x24, 0x22, 0x2B, 0x28, 0x29, 0x2C, 0x2C, - 0x29, 0x28, 0x2A, 0x2B, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x2B, 0x2B, 0x20, 0x20, 0x20, 0x21, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x21, 0x20, 0x2B, 0x2A, 0x27, - 0x3D, 0x4B, 0x48, 0x4C, 0x2B, 0x3C, 0x27, 0x3C, - 0x3C, 0x23, 0x4D, 0x4E, 0x4F, 0x50, 0x33, 0x27, - 0x27, 0x27, 0x27, 0x27, 0x27, 0x39, 0x3F, 0x39, - 0x51, 0x20, 0x39, 0x39, 0x47, 0x40, 0x4D, 0x4D, - 0x40, 0x52, 0x4D, 0x40, 0x47, 0x40, 0x39, 0x39, - 0x53, 0x54, 0x25, 0x24, 0x20, 0x2A, 0x29, 0x2C, - 0x2C, 0x2C, 0x29, 0x2A, 0x2B, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x21, 0x21, 0x22, 0x22, - 0x22, 0x21, 0x20, 0x2B, 0x28, 0x2A, 0x20, 0x27, - 0x36, 0x4F, 0x55, 0x48, 0x56, 0x3D, 0x3C, 0x3C, - 0x32, 0x57, 0x56, 0x58, 0x49, 0x56, 0x56, 0x27, - 0x27, 0x27, 0x27, 0x27, 0x27, 0x22, 0x20, 0x20, - 0x41, 0x39, 0x39, 0x3A, 0x59, 0x5A, 0x59, 0x5B, - 0x5C, 0x3A, 0x4D, 0x5D, 0x57, 0x39, 0x39, 0x4A, - 0x5E, 0x33, 0x54, 0x33, 0x24, 0x22, 0x2B, 0x28, - 0x2C, 0x2C, 0x2C, 0x29, 0x28, 0x2B, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x21, 0x21, 0x21, 0x22, 0x22, 0x21, - 0x20, 0x2B, 0x2A, 0x2A, 0x20, 0x22, 0x22, 0x27, - 0x5F, 0x2D, 0x3C, 0x60, 0x56, 0x54, 0x61, 0x49, - 0x35, 0x56, 0x34, 0x27, 0x62, 0x27, 0x56, 0x39, - 0x27, 0x27, 0x27, 0x27, 0x27, 0x30, 0x63, 0x54, - 0x40, 0x64, 0x65, 0x66, 0x67, 0x67, 0x68, 0x5F, - 0x2E, 0x69, 0x6A, 0x67, 0x5F, 0x3A, 0x39, 0x2C, - 0x53, 0x23, 0x25, 0x54, 0x33, 0x25, 0x23, 0x20, - 0x2A, 0x29, 0x2C, 0x2C, 0x29, 0x28, 0x2B, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x21, 0x21, 0x21, 0x21, 0x21, 0x20, 0x20, - 0x2B, 0x2A, 0x20, 0x22, 0x22, 0x21, 0x2B, 0x27, - 0x62, 0x36, 0x27, 0x33, 0x6B, 0x54, 0x3D, 0x3C, - 0x49, 0x57, 0x27, 0x27, 0x27, 0x27, 0x56, 0x57, - 0x27, 0x27, 0x27, 0x27, 0x27, 0x6C, 0x31, 0x6D, - 0x64, 0x51, 0x6E, 0x2E, 0x2E, 0x6F, 0x5A, 0x70, - 0x70, 0x71, 0x72, 0x67, 0x67, 0x69, 0x73, 0x46, - 0x4A, 0x2A, 0x21, 0x25, 0x33, 0x54, 0x33, 0x24, - 0x20, 0x2A, 0x29, 0x2C, 0x2C, 0x29, 0x28, 0x2B, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x21, 0x21, 0x21, 0x21, 0x20, 0x20, 0x2B, - 0x2B, 0x22, 0x22, 0x22, 0x2B, 0x28, 0x2A, 0x27, - 0x27, 0x39, 0x3C, 0x3D, 0x45, 0x74, 0x75, 0x76, - 0x76, 0x45, 0x27, 0x27, 0x27, 0x27, 0x56, 0x77, - 0x27, 0x27, 0x27, 0x27, 0x27, 0x78, 0x78, 0x5E, - 0x79, 0x7A, 0x7B, 0x6E, 0x5A, 0x5A, 0x70, 0x7C, - 0x70, 0x5B, 0x7D, 0x5A, 0x66, 0x7E, 0x7F, 0x79, - 0x48, 0x6B, 0x2C, 0x20, 0x24, 0x33, 0x54, 0x33, - 0x24, 0x21, 0x2A, 0x29, 0x2C, 0x2C, 0x29, 0x28, - 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x21, 0x21, 0x21, 0x20, 0x20, 0x2B, 0x2B, 0x21, - 0x22, 0x22, 0x20, 0x28, 0x2B, 0x20, 0x22, 0x27, - 0x27, 0x80, 0x27, 0x81, 0x82, 0x83, 0x84, 0x85, - 0x74, 0x85, 0x84, 0x27, 0x3C, 0x4F, 0x4F, 0x66, - 0x27, 0x27, 0x27, 0x27, 0x27, 0x22, 0x23, 0x5E, - 0x64, 0x86, 0x79, 0x73, 0x87, 0x88, 0x7C, 0x5A, - 0x5A, 0x71, 0x7D, 0x71, 0x89, 0x79, 0x8A, 0x8A, - 0x51, 0x8B, 0x48, 0x39, 0x2A, 0x22, 0x33, 0x54, - 0x33, 0x25, 0x22, 0x2B, 0x29, 0x2C, 0x2C, 0x29, - 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x21, 0x21, 0x20, 0x20, 0x2B, 0x2B, 0x22, 0x23, - 0x21, 0x2A, 0x2A, 0x20, 0x21, 0x23, 0x25, 0x27, - 0x27, 0x55, 0x8C, 0x8D, 0x8E, 0x83, 0x8F, 0x90, - 0x91, 0x92, 0x92, 0x85, 0x85, 0x93, 0x51, 0x27, - 0x27, 0x27, 0x27, 0x27, 0x27, 0x2A, 0x29, 0x51, - 0x79, 0x79, 0x94, 0x89, 0x89, 0x89, 0x5A, 0x95, - 0x64, 0x88, 0x96, 0x97, 0x7A, 0x73, 0x98, 0x98, - 0x99, 0x50, 0x50, 0x48, 0x6B, 0x28, 0x21, 0x25, - 0x54, 0x54, 0x25, 0x22, 0x2B, 0x29, 0x2C, 0x29, - 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x2B, 0x20, 0x22, 0x22, 0x20, - 0x2B, 0x2B, 0x20, 0x22, 0x24, 0x25, 0x33, 0x27, - 0x27, 0x9A, 0x9B, 0x9C, 0x9D, 0x83, 0x9E, 0x85, - 0x9F, 0x92, 0x85, 0x85, 0x85, 0x85, 0x92, 0xA0, - 0x27, 0x27, 0x27, 0x27, 0x27, 0xA1, 0x47, 0xA2, - 0xA2, 0x94, 0xA3, 0x94, 0x95, 0x95, 0x73, 0x73, - 0x95, 0x87, 0xA4, 0x5B, 0x97, 0x7B, 0x88, 0x98, - 0xA2, 0x50, 0x48, 0x48, 0x48, 0x8B, 0x29, 0x20, - 0x25, 0x54, 0x54, 0x25, 0x22, 0x2B, 0x29, 0x29, - 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x21, 0x22, 0x22, 0x2B, 0x2B, - 0x20, 0x21, 0x23, 0x24, 0x25, 0x25, 0x33, 0x27, - 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0x8F, 0x90, 0x90, - 0x9F, 0x90, 0x85, 0x90, 0x85, 0x74, 0xAA, 0x81, - 0x27, 0x27, 0x27, 0x27, 0x27, 0xAB, 0x40, 0xAC, - 0x79, 0xA3, 0x89, 0xAD, 0x95, 0x6F, 0xAE, 0xAE, - 0xAE, 0x5B, 0x59, 0x88, 0x7B, 0x89, 0x79, 0xAF, - 0xA2, 0x6B, 0x48, 0x48, 0x48, 0x48, 0x50, 0x2C, - 0x20, 0x24, 0x33, 0x54, 0x25, 0x22, 0x2A, 0x2A, - 0x21, 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x21, 0x23, 0x22, 0x2B, 0x20, 0x20, - 0x22, 0x23, 0x24, 0x25, 0x24, 0x24, 0x22, 0x27, - 0xB0, 0x8C, 0xAA, 0xB1, 0xB2, 0x84, 0x85, 0x9F, - 0x85, 0x85, 0x85, 0xB3, 0xB4, 0xAA, 0xAA, 0xA0, - 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x2A, 0xB5, - 0xA3, 0xA3, 0xAC, 0x5D, 0xB6, 0xAE, 0xB7, 0x69, - 0x73, 0x5B, 0x88, 0x89, 0x95, 0x73, 0x99, 0x99, - 0x59, 0x2A, 0x39, 0x48, 0x48, 0x50, 0x48, 0x50, - 0x2C, 0x20, 0x24, 0x33, 0x54, 0x25, 0x21, 0x20, - 0x21, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x21, 0x23, 0x21, 0x2B, 0x20, 0x20, 0x22, - 0x22, 0x24, 0x24, 0x23, 0x22, 0x20, 0x2A, 0x27, - 0x27, 0xB0, 0x8C, 0xA9, 0xB2, 0x9E, 0x91, 0x85, - 0x85, 0x93, 0xB8, 0x75, 0xAA, 0xA7, 0x8C, 0x27, - 0x27, 0x27, 0x33, 0x3C, 0x27, 0x27, 0x2C, 0x7B, - 0x55, 0x79, 0xA3, 0x5D, 0xB9, 0x43, 0x7F, 0x7E, - 0x5F, 0x5A, 0x5A, 0x95, 0x64, 0x73, 0x58, 0x64, - 0x5C, 0x25, 0x2B, 0x3F, 0x48, 0x48, 0x8B, 0x48, - 0x48, 0x2C, 0x20, 0x25, 0x54, 0x33, 0x24, 0x22, - 0x2B, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x21, 0x23, 0x21, 0x20, 0x20, 0x20, 0x21, 0x22, - 0x24, 0x23, 0x22, 0x21, 0x2B, 0x20, 0x54, 0x27, - 0x27, 0x8B, 0x81, 0xA5, 0x93, 0x93, 0x74, 0xA5, - 0xBA, 0x75, 0xBB, 0xBC, 0xB4, 0x6D, 0x50, 0x6B, - 0x27, 0x27, 0x30, 0x33, 0x49, 0x27, 0x27, 0x5E, - 0x6F, 0x73, 0x94, 0xBD, 0x4E, 0x5D, 0x7F, 0x7F, - 0xB7, 0x68, 0x73, 0x6E, 0xB7, 0x7F, 0x95, 0x97, - 0x47, 0x63, 0x25, 0x20, 0x3F, 0x48, 0x8B, 0x8B, - 0x48, 0x48, 0x2C, 0x20, 0x25, 0x54, 0x33, 0x25, - 0x2B, 0x2B, 0x2B, 0x20, 0x20, 0x20, 0x21, 0x21, - 0x23, 0x21, 0x20, 0x20, 0x20, 0x20, 0x24, 0x24, - 0x22, 0x21, 0x20, 0x2A, 0x33, 0x30, 0x30, 0x27, - 0x27, 0x50, 0xBE, 0xBF, 0x9A, 0xB3, 0x9B, 0xBB, - 0xBB, 0xC0, 0x8C, 0xC1, 0x8B, 0xC2, 0x47, 0x8B, - 0x27, 0x27, 0x38, 0x63, 0x63, 0x27, 0x27, 0xC3, - 0xB5, 0x95, 0x72, 0x95, 0x6F, 0x69, 0x7E, 0x66, - 0x7E, 0x7F, 0x6E, 0x7E, 0x95, 0x95, 0x73, 0x70, - 0x30, 0x30, 0x30, 0x33, 0x20, 0x3F, 0x48, 0x8B, - 0x6B, 0x48, 0x50, 0x29, 0x21, 0x33, 0x54, 0x33, - 0x2A, 0x2B, 0x2B, 0x20, 0x20, 0x21, 0x21, 0x23, - 0x21, 0x20, 0x20, 0x20, 0x20, 0x24, 0x24, 0x22, - 0x20, 0x2B, 0x21, 0xC4, 0x30, 0x60, 0x30, 0x27, - 0x27, 0xC5, 0x8B, 0x39, 0xC6, 0xC7, 0xA6, 0xA6, - 0xC8, 0x9A, 0x3B, 0x39, 0x50, 0x56, 0x56, 0x4F, - 0x33, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x48, - 0x59, 0x94, 0x73, 0xAE, 0xB7, 0xB7, 0x7E, 0x7E, - 0x7E, 0x7E, 0x7E, 0x5A, 0x70, 0x7C, 0x71, 0xC3, - 0x63, 0x30, 0x60, 0x78, 0x54, 0x20, 0x6B, 0x48, - 0x6B, 0x6B, 0x50, 0x50, 0x29, 0x22, 0x33, 0x33, - 0x2A, 0x2B, 0x20, 0x20, 0x21, 0x22, 0x22, 0x22, - 0x21, 0x20, 0x20, 0x20, 0x24, 0x24, 0x20, 0x20, - 0x2B, 0x24, 0x30, 0x60, 0x60, 0x30, 0xAB, 0x27, - 0x27, 0x40, 0x4C, 0x50, 0x39, 0x87, 0xC3, 0x53, - 0x37, 0x48, 0x37, 0x48, 0xC9, 0x56, 0xB9, 0x56, - 0xCA, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x3C, - 0x51, 0x5A, 0x6E, 0xB7, 0xB7, 0x7E, 0x7E, 0x7E, - 0x7E, 0x7E, 0x7F, 0xB7, 0x5A, 0x7C, 0x5B, 0x37, - 0x23, 0x63, 0x31, 0x6C, 0xCB, 0x63, 0x20, 0x6B, - 0x50, 0x3F, 0x39, 0x50, 0x8B, 0x28, 0x24, 0x24, - 0x2B, 0x2B, 0x20, 0x21, 0x22, 0x22, 0x22, 0x21, - 0x20, 0x20, 0x20, 0x23, 0x23, 0x20, 0x20, 0x2B, - 0x33, 0x78, 0xCB, 0x60, 0x30, 0x22, 0x3D, 0x27, - 0x2F, 0x56, 0x4E, 0x8B, 0x6B, 0x39, 0x48, 0x8B, - 0x6B, 0x8B, 0x80, 0xC9, 0xB9, 0xB9, 0x56, 0xB9, - 0x56, 0x34, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, - 0x48, 0xB5, 0xB7, 0xB7, 0x7E, 0x7E, 0x2E, 0x7E, - 0x7E, 0x7E, 0x7F, 0x7C, 0x65, 0x71, 0x3A, 0x48, - 0x2C, 0x24, 0x30, 0x6C, 0x34, 0x6C, 0xC4, 0x20, - 0x8B, 0x50, 0x39, 0x39, 0x48, 0x6B, 0x2B, 0x22, - 0x2B, 0x20, 0x21, 0x22, 0x23, 0x23, 0x22, 0x21, - 0x20, 0x2B, 0x23, 0x22, 0x20, 0x2B, 0x2B, 0x54, - 0x60, 0x31, 0xCB, 0x54, 0x20, 0x3D, 0x36, 0x27, - 0x4E, 0xB9, 0x56, 0x56, 0x8B, 0x6B, 0x50, 0x6B, - 0x40, 0x56, 0xB9, 0xB9, 0xB9, 0xB9, 0x56, 0xB9, - 0x56, 0x56, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, - 0x27, 0x7B, 0x6E, 0xB7, 0xB7, 0xB7, 0x7E, 0x7F, - 0xB7, 0xB7, 0x7F, 0x7E, 0x6F, 0x5B, 0x29, 0x2C, - 0x48, 0x39, 0x24, 0x60, 0x58, 0xAF, 0xCC, 0x63, - 0x20, 0x8B, 0x8B, 0x39, 0x39, 0x48, 0x3F, 0x28, - 0x20, 0x20, 0x22, 0x23, 0x23, 0x23, 0x22, 0x20, - 0x2B, 0x22, 0x22, 0x2B, 0x2B, 0x20, 0x54, 0xCB, - 0x31, 0xCB, 0x25, 0x20, 0x27, 0x27, 0x27, 0x48, - 0xB9, 0x56, 0xB9, 0x56, 0x4F, 0x48, 0x47, 0x57, - 0x56, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0x56, - 0xB9, 0x56, 0x62, 0x27, 0x27, 0x27, 0x27, 0x27, - 0x27, 0x48, 0x6F, 0x69, 0xB7, 0xB7, 0xB7, 0x7F, - 0xB7, 0xB7, 0xB7, 0x73, 0x59, 0x50, 0x29, 0x2B, - 0x28, 0x8B, 0x39, 0x25, 0x31, 0x55, 0xB6, 0x34, - 0x63, 0x2B, 0x48, 0x6B, 0x2C, 0x39, 0x47, 0x6B, - 0x22, 0x22, 0x23, 0x24, 0x23, 0x22, 0x20, 0x2B, - 0x20, 0x22, 0x2A, 0x2B, 0x20, 0x33, 0xCB, 0x31, - 0x78, 0x24, 0x21, 0xCD, 0x27, 0x27, 0x27, 0x56, - 0x56, 0xB9, 0x56, 0xB9, 0x56, 0x56, 0x56, 0xB9, - 0x56, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0x56, - 0xB9, 0x56, 0xC9, 0x27, 0x27, 0x27, 0x27, 0x27, - 0x27, 0x27, 0x41, 0x64, 0xB7, 0xB7, 0xB7, 0x7F, - 0x68, 0xB7, 0xAE, 0xA3, 0x23, 0x39, 0x8B, 0x2A, - 0x20, 0x20, 0x39, 0x6B, 0x25, 0xCC, 0x43, 0x43, - 0x34, 0x63, 0x2A, 0x48, 0x3F, 0x39, 0x6B, 0x6B, - 0x24, 0x23, 0x24, 0x24, 0x23, 0x21, 0x2B, 0x2B, - 0x22, 0x2B, 0x2B, 0x20, 0x24, 0x78, 0x31, 0x30, - 0x23, 0x21, 0x21, 0x27, 0x27, 0x27, 0x80, 0x56, - 0x56, 0xB9, 0x56, 0xB9, 0x56, 0xB9, 0x56, 0xB9, - 0x56, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, - 0x56, 0xB9, 0x56, 0x3C, 0x27, 0x27, 0x27, 0x27, - 0x27, 0x27, 0x27, 0xCE, 0x8A, 0xAE, 0x6F, 0xB7, - 0x6F, 0x89, 0x71, 0x78, 0x63, 0x23, 0x39, 0x6B, - 0x2B, 0x20, 0x20, 0x2C, 0x6B, 0x25, 0x34, 0x42, - 0x42, 0x34, 0x54, 0x29, 0x48, 0x3F, 0x39, 0x3F, - 0x25, 0x24, 0x25, 0x24, 0x22, 0x20, 0x2A, 0x21, - 0x2B, 0x2A, 0x20, 0x22, 0x30, 0x60, 0x30, 0x22, - 0x21, 0x22, 0x27, 0x27, 0x27, 0x2D, 0x4C, 0x56, - 0x56, 0xB9, 0xB9, 0x56, 0xB9, 0xB9, 0x56, 0x56, - 0xB9, 0xB9, 0xB9, 0x56, 0x56, 0x56, 0xB9, 0xB9, - 0xB9, 0xB9, 0x56, 0x2E, 0x27, 0x27, 0x27, 0x27, - 0x27, 0x27, 0x27, 0x40, 0x97, 0x95, 0x5A, 0x71, - 0x7C, 0xCE, 0x40, 0x60, 0x31, 0x30, 0x23, 0x3F, - 0x3F, 0x20, 0x20, 0x20, 0x29, 0x8B, 0x33, 0x58, - 0x66, 0x43, 0xCC, 0x25, 0x39, 0x50, 0x6B, 0x2C, - 0x33, 0x25, 0x25, 0x23, 0x20, 0x2A, 0x2B, 0x20, - 0x2A, 0x2B, 0x22, 0x54, 0x30, 0x30, 0x24, 0x22, - 0x21, 0x27, 0x27, 0x27, 0x27, 0xAF, 0x29, 0x4E, - 0x4F, 0xB9, 0x56, 0xB9, 0x4D, 0x4D, 0x77, 0xC9, - 0xB9, 0xB9, 0xB9, 0x56, 0xC9, 0x4D, 0x4D, 0x80, - 0x4C, 0x40, 0xC9, 0x4D, 0x27, 0x27, 0x27, 0x27, - 0x27, 0x27, 0x27, 0x27, 0xCF, 0x97, 0x97, 0xCE, - 0x86, 0xD0, 0x54, 0x6C, 0x58, 0x34, 0x60, 0x23, - 0x6B, 0x39, 0x20, 0x20, 0x20, 0x28, 0x6B, 0x54, - 0xD1, 0x66, 0xB6, 0x60, 0x22, 0x6B, 0x8B, 0x2C, - 0x54, 0x33, 0x24, 0x22, 0x2B, 0x28, 0x20, 0x28, - 0x2B, 0x20, 0x25, 0xC4, 0x30, 0x25, 0x22, 0x21, - 0x26, 0x27, 0x27, 0x27, 0x27, 0x20, 0x4B, 0x52, - 0x80, 0x4F, 0xB9, 0x56, 0xB9, 0x80, 0x56, 0xB9, - 0xB9, 0xB9, 0xB9, 0xB9, 0x4D, 0x80, 0x50, 0x48, - 0x50, 0x50, 0x50, 0x56, 0x3D, 0x27, 0x36, 0x27, - 0x27, 0x27, 0x27, 0x3C, 0x46, 0xC3, 0x86, 0x86, - 0xD0, 0x39, 0x24, 0x6C, 0xD1, 0x43, 0x43, 0x6C, - 0x24, 0x6B, 0x2C, 0x20, 0x20, 0x20, 0x29, 0x39, - 0x63, 0xD1, 0x42, 0x55, 0xC4, 0x2B, 0x8B, 0x39, - 0x54, 0x25, 0x24, 0x20, 0x2A, 0x2A, 0x28, 0x28, - 0x20, 0x22, 0x54, 0x63, 0x25, 0x24, 0x22, 0x22, - 0x27, 0x27, 0x27, 0x27, 0x27, 0x28, 0x77, 0x56, - 0xB9, 0xB9, 0xB9, 0x56, 0xB9, 0xC9, 0x56, 0xB9, - 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0x56, 0xB9, 0x4F, - 0x77, 0x47, 0x8B, 0x40, 0x56, 0x27, 0x27, 0x49, - 0x2D, 0x27, 0x27, 0x27, 0x39, 0x40, 0x39, 0x39, - 0x28, 0x3F, 0x39, 0x33, 0x58, 0x66, 0x35, 0x2E, - 0x58, 0x24, 0x8B, 0x29, 0x20, 0x20, 0x20, 0x39, - 0x29, 0x30, 0x55, 0xB6, 0xCC, 0x25, 0x29, 0x39, - 0x54, 0x25, 0x22, 0x2B, 0x29, 0x2A, 0x29, 0x2B, - 0x22, 0x24, 0x54, 0x33, 0x25, 0x22, 0x2B, 0x54, - 0x27, 0x27, 0x62, 0x27, 0x30, 0x80, 0xB9, 0x56, - 0xB9, 0xB9, 0xB9, 0x56, 0xB9, 0x56, 0xB9, 0xB9, - 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0x56, 0xB9, 0x56, - 0xB9, 0x56, 0x4D, 0x8B, 0x77, 0x36, 0x27, 0x27, - 0x3C, 0x2F, 0x27, 0x27, 0x39, 0x39, 0x39, 0x47, - 0x20, 0x2B, 0x2C, 0x39, 0x33, 0xB6, 0x35, 0x35, - 0x35, 0xAF, 0x24, 0x48, 0x2A, 0x20, 0x20, 0x20, - 0x8B, 0x2B, 0x78, 0xAF, 0x58, 0x30, 0x21, 0x28, - 0x33, 0x25, 0x21, 0x28, 0x29, 0x29, 0x28, 0x20, - 0x24, 0x33, 0x54, 0x33, 0x23, 0x20, 0x24, 0xD2, - 0x27, 0x49, 0x27, 0x27, 0x56, 0xB9, 0xB9, 0x56, - 0xB9, 0xB9, 0xB9, 0x56, 0xB9, 0x56, 0xB9, 0xB9, - 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0x56, 0xB9, 0x56, - 0xB9, 0xB9, 0x56, 0xC9, 0x50, 0x56, 0x27, 0x27, - 0x3D, 0x38, 0x3D, 0x27, 0x27, 0x47, 0x39, 0x39, - 0x28, 0x20, 0x20, 0x2A, 0x39, 0x54, 0x43, 0x35, - 0x35, 0x35, 0xAF, 0x23, 0x48, 0x2B, 0x20, 0x20, - 0x2B, 0x48, 0x22, 0x60, 0x34, 0xCB, 0x25, 0x21, - 0x33, 0x24, 0x2B, 0x29, 0x29, 0x29, 0x2B, 0x22, - 0x25, 0x54, 0x54, 0x25, 0x22, 0x2B, 0x33, 0x27, - 0x27, 0x32, 0x27, 0x30, 0x56, 0xB9, 0xB9, 0x56, - 0xB9, 0xB9, 0xB9, 0x56, 0xB9, 0x56, 0xB9, 0xB9, - 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0x56, 0xB9, 0x56, - 0xB9, 0xB9, 0x56, 0x56, 0xC9, 0x4C, 0x36, 0x3C, - 0x62, 0x2F, 0x2E, 0x27, 0x27, 0x54, 0x47, 0x47, - 0x8B, 0x2B, 0x20, 0x20, 0x20, 0x3F, 0x54, 0x2E, - 0x35, 0x35, 0x35, 0x34, 0x21, 0x8B, 0x2A, 0x20, - 0x20, 0x2C, 0x6B, 0x25, 0x60, 0x60, 0x54, 0x23, - 0x25, 0x22, 0x2A, 0x2C, 0x29, 0x28, 0x20, 0x24, - 0x54, 0x63, 0x54, 0x24, 0x2B, 0x22, 0x24, 0x27, - 0x36, 0x27, 0x27, 0x56, 0x56, 0xB9, 0xB9, 0x56, - 0xB9, 0xB9, 0xB9, 0x56, 0x56, 0x56, 0xB9, 0xB9, - 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0x56, 0xB9, 0x56, - 0xB9, 0xB9, 0xB9, 0x56, 0xB9, 0x56, 0x4C, 0x36, - 0x66, 0xD3, 0x27, 0x2F, 0x27, 0x54, 0x54, 0x27, - 0x26, 0x6B, 0x20, 0x20, 0x20, 0x20, 0x6B, 0x63, - 0x35, 0x35, 0x35, 0x62, 0xCB, 0x2A, 0x3F, 0x28, - 0x2B, 0x2A, 0x50, 0x29, 0x33, 0x30, 0x54, 0x25, - 0x24, 0x20, 0x29, 0x2C, 0x2C, 0x2A, 0x21, 0x33, - 0xC4, 0xC4, 0x33, 0x21, 0x29, 0x22, 0x27, 0x27, - 0x99, 0x27, 0x31, 0xB9, 0xB9, 0xB9, 0xB9, 0x56, - 0xB9, 0xB9, 0xB9, 0x56, 0x56, 0x56, 0xB9, 0xB9, - 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0x56, 0xB9, 0x56, - 0xB9, 0xB9, 0xB9, 0x56, 0xB9, 0x56, 0x56, 0x3D, - 0x3D, 0x3C, 0x3C, 0x55, 0x54, 0x54, 0x54, 0x20, - 0x27, 0x2C, 0x39, 0x20, 0x20, 0x20, 0x20, 0x48, - 0x30, 0x62, 0x35, 0x35, 0x42, 0x54, 0x39, 0x39, - 0x2C, 0x28, 0x3F, 0x8B, 0x20, 0x33, 0x54, 0x24, - 0x22, 0x2B, 0x2C, 0x2C, 0x2C, 0x2B, 0x24, 0x54, - 0x30, 0xC4, 0x25, 0x2B, 0x28, 0x2B, 0x27, 0x3D, - 0x27, 0x27, 0x56, 0xB9, 0xB9, 0xB9, 0xB9, 0x56, - 0xB9, 0xB9, 0x56, 0x56, 0x4F, 0x56, 0xB9, 0xB9, - 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0x56, 0xB9, 0x56, - 0xB9, 0xB9, 0xB9, 0xB9, 0x56, 0x56, 0x56, 0x27, - 0x20, 0x20, 0x20, 0x54, 0x54, 0x54, 0x54, 0x20, - 0x20, 0x2D, 0x2D, 0x29, 0x20, 0x20, 0x20, 0x20, - 0x48, 0x60, 0x66, 0x35, 0x62, 0x34, 0x22, 0x2C, - 0x2C, 0x3F, 0x6B, 0x48, 0x2C, 0x22, 0x23, 0x23, - 0x20, 0x2A, 0x2C, 0x29, 0x29, 0x20, 0x25, 0xC4, - 0x30, 0x54, 0x22, 0x29, 0x28, 0xD2, 0x27, 0x35, - 0x27, 0x49, 0x56, 0xB9, 0xB9, 0xB9, 0xB9, 0x56, - 0xB9, 0xB9, 0x56, 0x4F, 0x56, 0x56, 0xB9, 0xB9, - 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0x56, 0xB9, 0x56, - 0xB9, 0xB9, 0xB9, 0x56, 0x56, 0x56, 0x40, 0x20, - 0x20, 0x54, 0x54, 0x54, 0x20, 0x20, 0x20, 0x20, - 0x2D, 0x2D, 0x2D, 0x49, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6B, 0x6C, 0x42, 0x2E, 0xB6, 0x54, 0x28, - 0x29, 0x2C, 0x6B, 0x48, 0x3F, 0x2A, 0x20, 0x22, - 0x2B, 0x28, 0x2C, 0x28, 0x29, 0x20, 0x33, 0x30, - 0x30, 0x54, 0x20, 0x2C, 0x29, 0x27, 0x27, 0x3D, - 0x27, 0x40, 0x56, 0xB9, 0x56, 0x56, 0xB9, 0x56, - 0xB9, 0x56, 0x56, 0x4D, 0x56, 0x56, 0xB9, 0xB9, - 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0x56, 0xB9, 0x56, - 0xB9, 0xB9, 0x56, 0x56, 0x63, 0x56, 0x54, 0x54, - 0x54, 0x54, 0x20, 0xD3, 0x45, 0x51, 0x51, 0x49, - 0x7C, 0x2D, 0x2D, 0x49, 0x49, 0x20, 0x20, 0x20, - 0x20, 0x2A, 0x2A, 0xCC, 0xB6, 0x8A, 0x60, 0x22, - 0x28, 0x29, 0x3F, 0x6B, 0x39, 0x29, 0x2B, 0x20, - 0x28, 0x2C, 0x28, 0x2A, 0x2A, 0x24, 0xC4, 0x30, - 0xC4, 0x33, 0x2B, 0x39, 0xCD, 0x27, 0x3C, 0x27, - 0x27, 0x56, 0xB9, 0x56, 0xB9, 0x56, 0xB9, 0x56, - 0xB9, 0x56, 0x56, 0x4D, 0x56, 0x56, 0xB9, 0xB9, - 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0x56, 0xB9, 0x56, - 0xB9, 0xB9, 0x56, 0x63, 0x63, 0x49, 0x2D, 0x20, - 0x20, 0x2D, 0xD3, 0x49, 0x66, 0x2D, 0x49, 0x49, - 0x49, 0x49, 0x49, 0x49, 0x49, 0x8B, 0x2B, 0x20, - 0x20, 0x20, 0x39, 0x23, 0x6C, 0xAF, 0xCB, 0x23, - 0x28, 0x28, 0x29, 0x2A, 0x2A, 0x2A, 0x2A, 0x20, - 0x29, 0x39, 0x2B, 0x2B, 0x2B, 0x25, 0x78, 0xC4, - 0x63, 0x23, 0x29, 0x39, 0x27, 0x27, 0x3D, 0x27, - 0x27, 0x56, 0xB9, 0x56, 0xB9, 0x56, 0xB9, 0x56, - 0xB9, 0x56, 0x56, 0x80, 0x4F, 0x56, 0xB9, 0xB9, - 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0x56, 0xB9, 0x56, - 0xB9, 0xB9, 0xB9, 0xB9, 0x2D, 0x49, 0x2D, 0x49, - 0x49, 0x2D, 0x49, 0x2D, 0x49, 0x2D, 0x2D, 0x2D, - 0x49, 0x49, 0x35, 0x49, 0x2D, 0x2D, 0x39, 0x28, - 0x20, 0x20, 0x2A, 0x28, 0x33, 0x60, 0xC4, 0x22, - 0x2C, 0x2A, 0x2A, 0x22, 0x23, 0x22, 0x20, 0x21, - 0x2C, 0x29, 0x20, 0x2B, 0x2B, 0x54, 0x30, 0xC4, - 0x63, 0x22, 0x2C, 0x27, 0x27, 0x27, 0x3D, 0x27, - 0x27, 0x56, 0x56, 0xB9, 0xB9, 0x56, 0xB9, 0x56, - 0xB9, 0x56, 0x56, 0x80, 0x56, 0x56, 0xB9, 0xB9, - 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0x56, 0xB9, 0x56, - 0xB9, 0xB9, 0xB9, 0xB9, 0x2D, 0x49, 0x2D, 0x49, - 0x61, 0x49, 0x2D, 0x49, 0x49, 0x2D, 0x2D, 0x49, - 0x49, 0x49, 0x2F, 0x49, 0x2D, 0x78, 0x29, 0x28, - 0x2C, 0x2A, 0x2B, 0x39, 0x2B, 0x25, 0x33, 0x20, - 0x2C, 0x20, 0x2A, 0x24, 0x54, 0x54, 0x23, 0x23, - 0x2C, 0x2A, 0x22, 0x2B, 0x20, 0x63, 0x30, 0x63, - 0xC4, 0x21, 0x39, 0x27, 0x27, 0x27, 0x35, 0x36, - 0x27, 0x56, 0x56, 0xB9, 0xB9, 0x56, 0xB9, 0x56, - 0xB9, 0xB9, 0x56, 0x80, 0x56, 0x56, 0xB9, 0xB9, - 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0x56, 0xB9, 0x56, - 0xB9, 0xB9, 0xB9, 0x56, 0x2D, 0x49, 0x49, 0x49, - 0x49, 0x27, 0x27, 0x2D, 0x38, 0x27, 0x36, 0x36, - 0x49, 0x27, 0x49, 0x2D, 0x2D, 0x44, 0x24, 0x2B, - 0x20, 0x2C, 0x3F, 0x6B, 0x2A, 0x20, 0x21, 0x28, - 0x2C, 0x20, 0x2B, 0x24, 0x30, 0xCB, 0x63, 0x54, - 0x28, 0x20, 0x24, 0x2B, 0x23, 0x78, 0xC4, 0x63, - 0x63, 0x2B, 0x3F, 0x27, 0x27, 0x27, 0x38, 0x33, - 0x3D, 0xB9, 0x56, 0xB9, 0xB9, 0x56, 0xB9, 0x56, - 0xB9, 0xB9, 0x56, 0x80, 0x56, 0x56, 0xB9, 0xB9, - 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0x56, 0xB9, 0x56, - 0xB9, 0xB9, 0xB9, 0x56, 0x63, 0x49, 0x49, 0x49, - 0x49, 0x49, 0x3D, 0x3D, 0x27, 0x27, 0x27, 0x2D, - 0x49, 0x49, 0x49, 0x2D, 0x62, 0x5F, 0xC4, 0x20, - 0x22, 0x2A, 0x6B, 0x8B, 0x2C, 0x2B, 0x2A, 0x3F, - 0x3F, 0x2A, 0x21, 0x21, 0xCB, 0x58, 0x6C, 0x60, - 0x20, 0x23, 0x24, 0x2A, 0x25, 0x78, 0x63, 0x63, - 0x54, 0x2A, 0x28, 0x27, 0x27, 0x27, 0x27, 0x62, - 0x3C, 0xB9, 0x56, 0x56, 0xB9, 0x56, 0xB9, 0x56, - 0xB9, 0x56, 0x56, 0x80, 0x56, 0x56, 0xB9, 0xB9, - 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0x56, 0xB9, 0x56, - 0xB9, 0xB9, 0xB9, 0xB9, 0x56, 0x49, 0x2D, 0x2D, - 0x2D, 0x3D, 0x2F, 0x3C, 0x2D, 0x3C, 0x27, 0x38, - 0x2D, 0x49, 0x2D, 0x2D, 0xD1, 0x43, 0x30, 0x20, - 0x24, 0x21, 0x21, 0x21, 0x2B, 0x2A, 0x29, 0x8B, - 0x6B, 0x29, 0x2B, 0x2A, 0x30, 0x55, 0x55, 0x34, - 0x22, 0x23, 0x24, 0x29, 0x54, 0x30, 0x63, 0x63, - 0x25, 0x29, 0x22, 0x3C, 0xA5, 0xD4, 0xD5, 0x27, - 0x31, 0x56, 0x56, 0x56, 0xB9, 0x56, 0xB9, 0x56, - 0xB9, 0x56, 0x56, 0x80, 0xB9, 0x56, 0xB9, 0xB9, - 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0x56, 0xB9, 0x56, - 0xB9, 0xB9, 0xB9, 0xB9, 0x56, 0x56, 0x2D, 0x2E, - 0x3E, 0x27, 0x27, 0x27, 0x27, 0x27, 0x36, 0x44, - 0x3C, 0x27, 0x2D, 0xC4, 0x78, 0xCC, 0x54, 0x2B, - 0x25, 0x24, 0x63, 0x60, 0x63, 0x24, 0x2A, 0x6B, - 0x3F, 0x39, 0x28, 0x21, 0x33, 0xB6, 0x44, 0x58, - 0x22, 0x23, 0x24, 0x2A, 0x30, 0x30, 0x63, 0x63, - 0x24, 0x39, 0x22, 0xBB, 0x9C, 0xB2, 0x9D, 0xA8, - 0x27, 0x8B, 0x56, 0x56, 0xB9, 0x56, 0xB9, 0xB9, - 0x56, 0xB9, 0x56, 0x80, 0xB9, 0x56, 0xB9, 0xB9, - 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0x56, 0xB9, 0x56, - 0xB9, 0xB9, 0xB9, 0x56, 0x56, 0xD6, 0xD6, 0xD7, - 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x32, - 0x3D, 0x27, 0x39, 0x33, 0xC4, 0xC4, 0x22, 0x28, - 0x25, 0x54, 0x30, 0xD1, 0xD1, 0x60, 0x23, 0x6B, - 0x3F, 0x39, 0x2C, 0x2B, 0x20, 0x58, 0x8A, 0x58, - 0x22, 0x23, 0x23, 0x2B, 0x78, 0x30, 0xC4, 0xC4, - 0x23, 0x29, 0xBB, 0xBB, 0xD8, 0xB2, 0x9D, 0xA9, - 0xA9, 0x3C, 0x60, 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, - 0x56, 0xB9, 0x56, 0x80, 0xB9, 0x56, 0xB9, 0xB9, - 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0x56, 0xB9, 0x56, - 0xB9, 0xB9, 0xB9, 0x56, 0xD9, 0x85, 0x85, 0x85, - 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x2D, - 0xA0, 0x83, 0x2C, 0x21, 0x30, 0x33, 0x29, 0x29, - 0x21, 0x33, 0x54, 0x42, 0x66, 0x55, 0xC4, 0x29, - 0x8B, 0x2C, 0x39, 0x28, 0x29, 0x31, 0x44, 0x58, - 0x23, 0x23, 0x21, 0x20, 0x30, 0xC4, 0xC4, 0x30, - 0x21, 0x20, 0xBB, 0xBC, 0xDA, 0xDB, 0xDC, 0xB2, - 0x83, 0xB4, 0x3C, 0x2F, 0xB9, 0x56, 0x56, 0xB9, - 0x56, 0xB9, 0x56, 0x80, 0x56, 0x56, 0xB9, 0xB9, - 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0x56, 0xB9, 0x56, - 0xB9, 0x56, 0x56, 0x56, 0xA7, 0xD4, 0x85, 0x82, - 0x3C, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x61, - 0x9E, 0x90, 0xDD, 0x21, 0x33, 0x25, 0x2C, 0x39, - 0x2A, 0x24, 0x24, 0x42, 0x62, 0x43, 0x34, 0x22, - 0x50, 0x39, 0x2C, 0x2C, 0x2A, 0x54, 0xD1, 0x58, - 0x22, 0x22, 0x2B, 0x22, 0x30, 0xC4, 0x30, 0x60, - 0x20, 0xDE, 0xBB, 0xD9, 0x84, 0x84, 0xDF, 0xA9, - 0xDB, 0xDB, 0x61, 0x27, 0x38, 0x4D, 0x56, 0x56, - 0x56, 0xB9, 0x56, 0xB9, 0x56, 0x56, 0xB9, 0xB9, - 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0x56, 0xB9, 0x56, - 0xB9, 0x56, 0x56, 0x56, 0x8D, 0xD9, 0xD5, 0xA6, - 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0xBB, - 0x85, 0xDB, 0xDD, 0x21, 0x22, 0x22, 0x3F, 0x39, - 0x2C, 0x2B, 0x25, 0x34, 0x62, 0x66, 0xD1, 0xC4, - 0x6B, 0x39, 0x2C, 0x39, 0x29, 0x21, 0x58, 0xCC, - 0x22, 0x21, 0x29, 0x23, 0x30, 0x30, 0x30, 0x5E, - 0x82, 0xBB, 0xE0, 0xB1, 0xE1, 0x9C, 0xD4, 0xDC, - 0x9D, 0xA9, 0xE2, 0x27, 0x27, 0x27, 0x4D, 0x56, - 0x56, 0xB9, 0x56, 0xB9, 0x56, 0x56, 0xB9, 0xB9, - 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0x56, 0xB9, 0x56, - 0xB9, 0x56, 0x4C, 0x48, 0xA8, 0xA8, 0xE3, 0x8C, - 0xC6, 0x3C, 0x27, 0x27, 0x27, 0xE4, 0xA6, 0xE5, - 0x83, 0xA9, 0xE6, 0xAF, 0x54, 0x2B, 0x8B, 0x39, - 0x39, 0x29, 0x20, 0x54, 0x42, 0x42, 0xB6, 0xCC, - 0x2A, 0x29, 0x39, 0x39, 0x2C, 0x2C, 0xCC, 0xCC, - 0x22, 0x20, 0x39, 0xE7, 0xC0, 0xD9, 0xA7, 0xBC, - 0x8D, 0xAA, 0x9C, 0xE8, 0x9C, 0x9D, 0xD4, 0xD4, - 0xD8, 0xA9, 0x84, 0xC7, 0x27, 0x27, 0x27, 0x2A, - 0x56, 0x56, 0x56, 0xB9, 0x56, 0x56, 0xB9, 0xB9, - 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0x56, 0xB9, 0x56, - 0x56, 0x56, 0x48, 0x50, 0xAA, 0xE3, 0xE3, 0xC0, - 0xA6, 0x9A, 0xBA, 0xC8, 0x9A, 0xDE, 0x9B, 0xD5, - 0xE8, 0xD8, 0xD5, 0x2E, 0x58, 0x33, 0x6B, 0x39, - 0x2C, 0x39, 0x29, 0x28, 0xD1, 0x43, 0xB6, 0xAF, - 0x23, 0x28, 0x2C, 0x39, 0x39, 0x8B, 0x30, 0x31, - 0x21, 0x20, 0x3F, 0xBB, 0xDF, 0xDF, 0xD5, 0xA8, - 0xD5, 0x9C, 0x8E, 0xB2, 0x9D, 0xE9, 0xD4, 0xD8, - 0x90, 0xB2, 0xA9, 0x8F, 0x27, 0x27, 0x27, 0x27, - 0x2F, 0x56, 0x56, 0xB9, 0x56, 0x56, 0xB9, 0xB9, - 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0x56, 0xB9, 0x56, - 0x56, 0xB9, 0x48, 0x48, 0x75, 0xE3, 0xAA, 0xAA, - 0xC0, 0xB4, 0xB4, 0xB4, 0x75, 0x9B, 0xD9, 0x83, - 0x9D, 0x90, 0xDF, 0xDD, 0x8A, 0x31, 0x4B, 0x2C, - 0x2C, 0x29, 0x2C, 0x3F, 0x6C, 0x55, 0xD1, 0x55, - 0x54, 0x29, 0x28, 0x39, 0x39, 0x6B, 0x24, 0x60, - 0x20, 0x2B, 0x3F, 0xA7, 0xB1, 0x9D, 0xA9, 0x8E, - 0xE5, 0xE5, 0xDF, 0xE0, 0xA9, 0x9D, 0xDF, 0xDF, - 0xEA, 0x9D, 0xB2, 0x84, 0xAA, 0x27, 0x27, 0x27, - 0x27, 0x35, 0x56, 0x56, 0x56, 0x56, 0xB9, 0xB9, - 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0x56, 0xB9, 0x56, - 0xB9, 0xB9, 0x48, 0x48, 0xA6, 0x9B, 0xE3, 0xAA, - 0xAA, 0x9B, 0x9B, 0x9B, 0xAA, 0xE3, 0xD5, 0xD4, - 0x9D, 0xA9, 0xA9, 0x9D, 0xEB, 0xAF, 0x23, 0x28, - 0x2C, 0x29, 0x28, 0x39, 0x54, 0xCC, 0xAF, 0x55, - 0x30, 0x29, 0x2B, 0x2C, 0x39, 0x39, 0x2B, 0xC4, - 0x2B, 0x29, 0x39, 0xA7, 0x8E, 0x9D, 0x83, 0xE5, - 0xB1, 0xDB, 0xDC, 0xE0, 0xDC, 0x84, 0xE9, 0x84, - 0x83, 0xD4, 0xEC, 0x83, 0x8F, 0xE4, 0x27, 0x27, - 0x27, 0x27, 0x56, 0x56, 0x56, 0x56, 0xB9, 0xB9, - 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0x56, 0xB9, 0x56, - 0xB9, 0x56, 0x40, 0x50, 0x9A, 0x75, 0xE3, 0xE3, - 0xE3, 0xD9, 0x8D, 0xAA, 0xD9, 0xA8, 0xB2, 0xDC, - 0xB2, 0x8D, 0x84, 0xEA, 0xB1, 0xEB, 0x54, 0x29, - 0x28, 0x2C, 0x2A, 0x28, 0x2B, 0x78, 0xCC, 0x58, - 0xCB, 0x20, 0x20, 0x29, 0x39, 0x39, 0x2C, 0x25, - 0x29, 0x2C, 0x39, 0xBB, 0xD9, 0xD9, 0x9D, 0x9D, - 0xB2, 0xB1, 0xD4, 0xDB, 0xB1, 0x9D, 0xD4, 0xEA, - 0xB1, 0x8D, 0xD8, 0x8E, 0x8F, 0xAA, 0x27, 0x27, - 0x27, 0x3D, 0x56, 0xB9, 0x56, 0xB9, 0xB9, 0xB9, - 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0x56, 0xB9, 0x56, - 0x56, 0x56, 0x47, 0xE4, 0xA6, 0x75, 0xAA, 0xA8, - 0x9C, 0x9C, 0xE1, 0x9C, 0x9C, 0x8E, 0xD8, 0x9D, - 0xA9, 0xDB, 0xA9, 0xDC, 0xD8, 0xDA, 0xD4, 0x2B, - 0x20, 0x2C, 0x28, 0x2A, 0x28, 0x63, 0x31, 0x58, - 0xCB, 0x24, 0x20, 0x2B, 0x2C, 0x39, 0x6B, 0x21, - 0x39, 0x6B, 0x2C, 0xC0, 0xE0, 0xB1, 0xB2, 0x9D, - 0x8E, 0xD8, 0xE0, 0xD9, 0x84, 0xDB, 0xD8, 0xB1, - 0x8E, 0xB2, 0xE2, 0x9C, 0x83, 0x9E, 0xBC, 0x3D, - 0xD3, 0x56, 0x56, 0xB9, 0x56, 0xB9, 0xB9, 0xB9, - 0xB9, 0xB9, 0xB9, 0xB9, 0xB9, 0x56, 0xB9, 0xB9, - 0x56, 0x4F, 0x27, 0x61, 0xA6, 0x9B, 0xE3, 0xA9, - 0xE9, 0xD4, 0xDA, 0xDB, 0x8E, 0xE1, 0xE9, 0x8E, - 0xD4, 0xA8, 0xE0, 0x84, 0xE8, 0xB1, 0xDC, 0x9D, - 0x20, 0x29, 0x29, 0x2B, 0x2C, 0x54, 0x78, 0xCC, - 0x78, 0x33, 0x2A, 0x20, 0x29, 0x39, 0x50, 0x2A, - 0x6B, 0x8B, 0x39, 0xC0, 0x8D, 0xB1, 0xE9, 0xA9, - 0xB2, 0xDC, 0x8E, 0xDC, 0xE1, 0xDA, 0xA9, 0x8E, - 0xEA, 0xE2, 0x83, 0xE8, 0x8E, 0x83, 0xE2, 0xED, - 0xB9, 0xB9, 0x56, 0xB9, 0x56, 0xB9, 0xB9, 0xB9, - 0xB9, 0xB9, 0xB9, 0xB9, 0x56, 0x56, 0x56, 0xB9, - 0xC9, 0x27, 0x27, 0xE4, 0xA6, 0x9B, 0xD5, 0xA8, - 0xD4, 0xB2, 0xD8, 0xDA, 0xD9, 0xE8, 0xE9, 0xE8, - 0xD8, 0xB1, 0xDA, 0xB2, 0xE9, 0x8E, 0xEC, 0xDA, - 0x22, 0x20, 0x39, 0x2B, 0x39, 0x24, 0xC4, 0x30, - 0x30, 0x54, 0x22, 0x29, 0x29, 0x39, 0x48, 0x2C, - 0x39, 0x6B, 0x39, 0xC0, 0x8D, 0xB1, 0xE9, 0xB2, - 0xB2, 0x8E, 0xA9, 0xD8, 0xDA, 0xB1, 0xA9, 0xDA, - 0x9C, 0xDC, 0x8E, 0xD4, 0xE8, 0xE8, 0x8F, 0x9B, - 0x4F, 0xB9, 0x56, 0xB9, 0x56, 0xB9, 0xB9, 0xB9, - 0xB9, 0xB9, 0xB9, 0xB9, 0x56, 0x56, 0x4F, 0x6B, - 0x27, 0x27, 0x27, 0xD7, 0xDE, 0xAA, 0xE3, 0xA8, - 0xB2, 0xD5, 0xE5, 0x90, 0xE2, 0xA9, 0xE9, 0xB2, - 0xDA, 0xB2, 0xE1, 0xB2, 0xE9, 0x8E, 0xDA, 0xDF, - 0x78, 0x2A, 0x2C, 0x2A, 0x6B, 0x28, 0x23, 0x54, - 0x63, 0xC4, 0x33, 0x28, 0x2C, 0x39, 0x47, 0x39, - 0x28, 0x2C, 0x29, 0xBB, 0x8D, 0x83, 0xE9, 0xD4, - 0xB2, 0xE9, 0xE9, 0xE8, 0xD4, 0xD8, 0xD4, 0xA9, - 0xDA, 0xB2, 0xE9, 0xA8, 0xB2, 0xA8, 0xD5, 0xAA, - 0xC6, 0x56, 0x56, 0x56, 0x56, 0x56, 0xB9, 0x56, - 0x56, 0x56, 0x56, 0x56, 0x56, 0xC9, 0x27, 0x27, - 0x27, 0x27, 0x27, 0xB8, 0xB4, 0x9B, 0xE3, 0x8E, - 0x9D, 0x8E, 0xB2, 0xE8, 0xE8, 0x8E, 0xB2, 0xDA, - 0xB2, 0x8E, 0xEC, 0xB2, 0x8E, 0xB2, 0xBB, 0x58, - 0xAF, 0x33, 0x50, 0x39, 0x6B, 0x39, 0x29, 0x20, - 0x33, 0x30, 0x78, 0x23, 0x6B, 0x6B, 0x48, 0x6B, - 0x2B, 0x2A, 0x29, 0xBB, 0xE5, 0x9C, 0xB1, 0xB2, - 0xE5, 0x84, 0x8E, 0x9C, 0x84, 0xB2, 0xB2, 0x9D, - 0x84, 0xDF, 0xA9, 0x84, 0x8E, 0xA8, 0xE3, 0x9B, - 0xA6, 0xD7, 0x80, 0x4F, 0x56, 0x56, 0x56, 0x4F, - 0x4F, 0x4F, 0x4F, 0x2A, 0x2D, 0x27, 0x27, 0x27, - 0x27, 0x27, 0x27, 0xB8, 0xB4, 0xAA, 0xD5, 0xA9, - 0x9D, 0xB2, 0x90, 0xEA, 0xE9, 0xE2, 0xE1, 0x8E, - 0xB2, 0x9D, 0x8E, 0xB1, 0xA7, 0xEE, 0x63, 0xD1, - 0x2E, 0xCC, 0x28, 0x48, 0x8B, 0x47, 0x6B, 0x28, - 0x23, 0x78, 0x6C, 0x54, 0x29, 0x50, 0x50, 0x6B, - 0x23, 0x20, 0xBB, 0xBC, 0xBB, 0x8D, 0xE3, 0xDF, - 0x9C, 0xA9, 0x8D, 0xA8, 0xD9, 0x90, 0x9D, 0xA9, - 0xDC, 0xA9, 0x83, 0xB2, 0xA9, 0xD4, 0xE3, 0x9B, - 0x8C, 0xEF, 0x27, 0x27, 0x27, 0x3C, 0x27, 0x27, - 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, - 0x27, 0x27, 0x27, 0xF0, 0xB4, 0x9B, 0xE3, 0x84, - 0x9D, 0x84, 0x90, 0xB1, 0xA9, 0x9C, 0xD9, 0xB1, - 0xB2, 0xEA, 0xBB, 0x51, 0x24, 0x30, 0x30, 0x42, - 0x66, 0x58, 0x24, 0x48, 0x50, 0x3F, 0x20, 0x25, - 0x22, 0x60, 0x34, 0x30, 0x20, 0x8B, 0x8B, 0x39, - 0x54, 0x24, 0x2B, 0xC0, 0xC0, 0xC0, 0xBB, 0x9B, - 0xBC, 0xAA, 0xAA, 0xE3, 0xE3, 0x9C, 0xB2, 0xD4, - 0x83, 0xD8, 0xE8, 0x83, 0x84, 0xE8, 0xE5, 0x75, - 0x9A, 0xF0, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, - 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, - 0x27, 0x27, 0x27, 0xF0, 0xB4, 0x9B, 0xE3, 0xA8, - 0xA9, 0xD8, 0x8E, 0xEA, 0xA8, 0x9C, 0xD9, 0xE0, - 0xC0, 0x5E, 0x2C, 0x20, 0x54, 0x60, 0x30, 0x66, - 0xB6, 0xCC, 0x63, 0x3F, 0x8B, 0x28, 0x22, 0x33, - 0x23, 0x31, 0xAF, 0x31, 0x22, 0x6B, 0x6B, 0x29, - 0x30, 0x54, 0x22, 0x89, 0xBA, 0xED, 0xA6, 0x8C, - 0xB4, 0xC0, 0xB4, 0x75, 0x75, 0x9B, 0x9B, 0xE5, - 0xA9, 0xD5, 0x8E, 0x8E, 0x9C, 0xE3, 0x75, 0x8C, - 0xC8, 0xF1, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, - 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, - 0x27, 0x27, 0x27, 0xF1, 0x9A, 0xB4, 0x9B, 0xE3, - 0xE3, 0xA8, 0xE3, 0xE5, 0xAA, 0xBC, 0xC0, 0x9A, - 0x26, 0x29, 0x20, 0x24, 0x63, 0x60, 0x54, 0x43, - 0x34, 0xCB, 0x30, 0x39, 0x2C, 0x20, 0x24, 0x54, - 0x22, 0x34, 0x34, 0x31, 0x24, 0x3F, 0x2C, 0x2B, - 0x31, 0x30, 0x25, 0x2A, 0x6B, 0x29, 0x20, 0xF2, - 0xBA, 0xBF, 0xC8, 0x9A, 0xA6, 0xA6, 0x8C, 0xB4, - 0x9B, 0xAA, 0xAA, 0xAA, 0x9B, 0x75, 0xDE, 0xBF, - 0x81, 0xEF, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, - 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, - 0x27, 0x27, 0x27, 0xEF, 0xBA, 0x9A, 0xB4, 0x75, - 0x9B, 0x9B, 0x9B, 0xC0, 0xB4, 0x9A, 0xA5, 0xC4, - 0x30, 0x28, 0x22, 0x33, 0x30, 0x30, 0x23, 0x34, - 0x31, 0x30, 0xC4, 0x2C, 0x2B, 0x22, 0x33, 0x63, - 0x21, 0x58, 0x6C, 0x60, 0x25, 0x39, 0x28, 0x2B, - 0xCC, 0x6C, 0x63, 0x20, 0x6B, 0x28, 0x2B, 0x20, - 0x63, 0x43, 0xF3, 0xEF, 0xF0, 0x81, 0xBA, 0xF4, - 0xF4, 0xA6, 0xDE, 0x8C, 0xA6, 0x9A, 0xBA, 0x81, - 0xB0, 0xE4, 0xA1, 0x20, 0x20, 0x23, 0x31, 0xC4, - 0x30, 0x24, 0x33, 0x31, 0x31, 0x60, 0x43, 0x35, - 0x35, 0x55, 0x6C, 0xEF, 0x81, 0xC8, 0x9A, 0xA6, - 0xB4, 0xB4, 0x8C, 0xA6, 0xBA, 0x68, 0x30, 0x30, - 0x30, 0x2B, 0x25, 0x54, 0xC4, 0x54, 0x24, 0x78, - 0x63, 0x63, 0x30, 0x29, 0x21, 0x24, 0x54, 0x63, - 0x23, 0x34, 0xCB, 0x30, 0x25, 0x39, 0x20, 0x20, - 0x58, 0x34, 0x60, 0x23, 0x6B, 0x29, 0x28, 0x20, - 0x22, 0xB6, 0x42, 0xB6, 0x58, 0x54, 0xF5, 0xD7, - 0xA5, 0xBA, 0xBA, 0xBA, 0xBA, 0x81, 0xA5, 0xF1, - 0xE4, 0x2A, 0x39, 0x20, 0x20, 0x20, 0x31, 0x60, - 0x54, 0x28, 0x2B, 0x22, 0x33, 0x30, 0x43, 0x35, - 0x66, 0xD1, 0x34, 0xE4, 0xEF, 0x81, 0xC8, 0x9A, - 0x9A, 0xC8, 0xC8, 0x81, 0xF6, 0x31, 0x63, 0x31, - 0x78, 0x2B, 0x54, 0x63, 0x54, 0x24, 0x23, 0x54, - 0x63, 0x54, 0x63, 0x2C, 0x23, 0x33, 0x63, 0x54, - 0x25, 0x31, 0x78, 0x30, 0x25, 0x3F, 0x20, 0x20, - 0xAF, 0x58, 0xCC, 0x33, 0x39, 0x29, 0x29, 0x2A, - 0x29, 0x58, 0x43, 0x42, 0xD1, 0xCB, 0x2C, 0x2C, - 0x37, 0xCD, 0xEF, 0xB0, 0xF0, 0xB0, 0xEF, 0xE4, - 0x63, 0x20, 0x20, 0x2C, 0x2C, 0x21, 0xCB, 0x78, - 0x54, 0x39, 0x39, 0x28, 0x2B, 0x28, 0x2B, 0xCB, - 0x55, 0xB6, 0xD1, 0x28, 0xE4, 0xD7, 0xB8, 0xF0, - 0xA5, 0xB0, 0xEF, 0x26, 0x23, 0x54, 0x31, 0x58, - 0xCB, 0x20, 0x63, 0x63, 0x25, 0x2B, 0x54, 0x78, - 0x30, 0x63, 0x54, 0x28, 0x33, 0x63, 0x63, 0x33, - 0x54, 0x78, 0xC4, 0x30, 0x24, 0x2C, 0x22, 0x22, - 0x55, 0x55, 0x34, 0x30, 0x28, 0x2C, 0x29, 0x29, - 0x28, 0x30, 0xB6, 0x42, 0x43, 0x55, 0x22, 0x29, - 0x2C, 0x2B, 0x2B, 0x3F, 0xE4, 0xE4, 0x43, 0x66, - 0x30, 0x23, 0x24, 0x2A, 0x28, 0x2B, 0x54, 0x63, - 0x33, 0x39, 0x28, 0x20, 0x20, 0x20, 0x2B, 0x31, - 0x30, 0xD1, 0x43, 0x30, 0x39, 0x28, 0xE4, 0xE4, - 0xD7, 0xF5, 0x2B, 0x6B, 0x20, 0x30, 0x34, 0xD1, - 0x60, 0x23, 0x63, 0x54, 0x22, 0x47, 0x60, 0xCB, - 0xC4, 0xC4, 0x25, 0x22, 0x54, 0xC4, 0x63, 0x23, - 0xC4, 0xC4, 0x63, 0xC4, 0x23, 0x2A, 0x24, 0x22, - 0x55, 0x55, 0xAF, 0x6C, 0x22, 0x39, 0x2C, 0x39, - 0x28, 0x23, 0xD1, 0x43, 0x42, 0x8A, 0x63, 0x39, - 0x39, 0x2A, 0x20, 0x6B, 0x33, 0xCC, 0xD1, 0xB6, - 0x30, 0x24, 0x54, 0x63, 0x31, 0xCC, 0xCC, 0xCB, - 0xC4, 0x2A, 0x39, 0x20, 0x20, 0x20, 0x39, 0x30, - 0x30, 0x6C, 0x43, 0x43, 0x6C, 0x63, 0x25, 0x24, - 0x63, 0x63, 0x63, 0x25, 0x63, 0xCC, 0xD1, 0x34, - 0x63, 0x25, 0x54, 0x25, 0x2A, 0x28, 0x31, 0xCB, - 0x63, 0x78, 0x24, 0x33, 0xC4, 0xC4, 0x33, 0x2C, - 0xC4, 0x54, 0x54, 0x30, 0x21, 0x22, 0x25, 0x23, - 0x55, 0x55, 0xD1, 0x58, 0x33, 0x6B, 0x2C, 0x39, - 0x39, 0x39, 0x34, 0x43, 0x42, 0x43, 0xCC, 0x2B, - 0x28, 0x29, 0x20, 0x28, 0x21, 0x30, 0xCC, 0xAF, - 0x54, 0x23, 0xC4, 0x54, 0x58, 0x2E, 0x35, 0x42, - 0x55, 0x54, 0x8B, 0x2A, 0x20, 0x20, 0x28, 0x22, - 0x78, 0x30, 0xD1, 0x43, 0x44, 0x6C, 0xC4, 0xC4, - 0x60, 0x31, 0x31, 0x63, 0x6C, 0xAF, 0xCC, 0xCB, - 0x24, 0x25, 0x33, 0x23, 0x2C, 0x24, 0x31, 0x30, - 0x63, 0xC4, 0x21, 0x54, 0x30, 0x63, 0x24, 0x2A, - 0x54, 0x63, 0x54, 0xC4, 0x2B, 0x24, 0x33, 0x24, - 0x34, 0x55, 0xD1, 0x55, 0x30, 0x28, 0x29, 0x39, - 0x39, 0x8B, 0x63, 0x55, 0x42, 0x66, 0xB6, 0x25, - 0x29, 0x29, 0x29, 0x28, 0x2A, 0x54, 0x78, 0x6C, - 0x23, 0x20, 0x25, 0x30, 0xCB, 0x62, 0x35, 0x35, - 0x35, 0x44, 0x24, 0x6B, 0x29, 0x20, 0x2A, 0x39, - 0x28, 0x63, 0x34, 0xB6, 0x34, 0xCB, 0x63, 0x30, - 0x31, 0x31, 0x30, 0x30, 0xCC, 0x60, 0x63, 0xC4, - 0x20, 0x33, 0x25, 0x20, 0x48, 0x33, 0x30, 0x54, - 0x78, 0x54, 0x2B, 0x63, 0x30, 0x63, 0x23, 0x22, - 0x63, 0x63, 0x63, 0x33, 0x28, 0x25, 0x54, 0x24, - 0x78, 0xAF, 0xD1, 0xD1, 0xCC, 0x22, 0x39, 0x39, - 0x2C, 0x3F, 0x2B, 0x34, 0xB6, 0x43, 0x43, 0xC4, - 0x2B, 0x28, 0x39, 0x50, 0x2C, 0x24, 0x63, 0x78, - 0x21, 0x2C, 0x2A, 0x23, 0x54, 0xD1, 0x35, 0x35, - 0x35, 0x35, 0x55, 0x22, 0x39, 0x2C, 0x2C, 0x2C, - 0x20, 0x30, 0xCC, 0x6C, 0xCB, 0x30, 0x54, 0x30, - 0x78, 0x63, 0x78, 0x30, 0x54, 0x78, 0x30, 0x23, - 0x2B, 0x33, 0x24, 0x28, 0x39, 0x24, 0x54, 0x30, - 0x78, 0x33, 0x25, 0xC4, 0xC4, 0x33, 0x39, 0x25, - 0xC4, 0x63, 0xC4, 0x24, 0x20, 0x54, 0x54, 0x25, - 0x63, 0xCC, 0xD1, 0xB6, 0x55, 0x54, 0x39, 0x29, - 0x39, 0x2C, 0x6B, 0x30, 0xAF, 0xB6, 0xB6, 0x60, - 0x22, 0x2A, 0x2C, 0x39, 0x2C, 0x21, 0x54, 0x63, - 0x21, 0x50, 0x2C, 0x2C, 0x2B, 0x25, 0x62, 0x35, - 0x35, 0x35, 0x35, 0xCC, 0x2B, 0x29, 0x2B, 0x20, - 0x23, 0x25, 0xC4, 0x30, 0xC4, 0x63, 0x63, 0x63, - 0x63, 0x33, 0x24, 0x31, 0x31, 0x31, 0x54, 0x28, - 0x24, 0x25, 0x22, 0x6B, 0x28, 0x24, 0xC4, 0x78, - 0x30, 0x24, 0x63, 0xC4, 0x54, 0x23, 0x29, 0x63, - 0xC4, 0x54, 0xC4, 0x21, 0x24, 0x54, 0x54, 0x25, - 0x30, 0xCB, 0xD1, 0xB6, 0x55, 0x63, 0x28, 0x29, - 0x39, 0x39, 0x48, 0x33, 0x58, 0x44, 0xB6, 0x60, - 0x24, 0x20, 0x2B, 0x28, 0x2A, 0x22, 0x54, 0x63, - 0x21, 0x48, 0x2A, 0x2B, 0x39, 0x21, 0xB6, 0x35, - 0x35, 0x35, 0x35, 0x42, 0x23, 0x29, 0x2A, 0x2B, - 0x23, 0x25, 0x54, 0x54, 0x54, 0x63, 0x63, 0x30, - 0x25, 0x2B, 0x31, 0x31, 0x31, 0x31, 0x21, 0x2C, - 0x33, 0x25, 0x21, 0x39, 0x20, 0x25, 0x30, 0x78, - 0xC4, 0x23, 0xC4, 0x30, 0x54, 0x20, 0x28, 0x63, - 0x63, 0x63, 0x63, 0x20, 0x25, 0x54, 0x54, 0x20, + 0x20, 0x4B, 0xC5, 0x7D, 0x24, 0xEE, 0x67, 0x30, + 0x30, 0x8D, 0x67, 0x8E, 0xF9, 0xF7, 0x97, 0xDD, + 0x2F, 0x2F, 0x51, 0x89, 0x89, 0x2F, 0x55, 0x2A, + 0xA5, 0x8F, 0x66, 0xA3, 0x2F, 0xB2, 0xB2, 0xB2, + 0xDD, 0xA3, 0x66, 0x98, 0x66, 0x2F, 0xB2, 0xB2, + 0xA3, 0xA3, 0xB2, 0x51, 0x89, 0x44, 0xE0, 0x5E, + 0x91, 0x9F, 0x9F, 0x7D, 0x7D, 0xD9, 0x24, 0xF0, + 0x79, 0x8E, 0xEE, 0x8E, 0x24, 0x40, 0x65, 0x35, + 0x69, 0x2E, 0x98, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, + 0x2F, 0xB2, 0xB2, 0xB2, 0x2F, 0x2F, 0x2F, 0x98, + 0xA5, 0xA7, 0x95, 0xD7, 0x8C, 0xF0, 0x8E, 0x8E, + 0xEE, 0x79, 0xF0, 0xED, 0x50, 0xE8, 0x89, 0x2F, + 0xA3, 0xA3, 0xB2, 0x89, 0xB2, 0x66, 0xA0, 0x55, + 0x8F, 0x98, 0x66, 0xA3, 0xB2, 0x51, 0x51, 0xB2, + 0x74, 0xA0, 0xA0, 0x98, 0x66, 0xB2, 0xB2, 0xB2, + 0xA3, 0xA3, 0x2F, 0xB2, 0xB2, 0xB2, 0xA3, 0x2F, + 0x51, 0x83, 0xE4, 0x87, 0xB8, 0xFA, 0xA9, 0xC6, + 0x40, 0x64, 0x64, 0x50, 0xD7, 0x65, 0x35, 0x60, + 0x98, 0xB2, 0x66, 0x66, 0xA3, 0x2F, 0xA3, 0xA3, + 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, 0xA3, 0x2F, 0xB2, + 0x89, 0xDD, 0x9B, 0xC0, 0x7D, 0x50, 0x8C, 0xED, + 0xED, 0x8C, 0x40, 0x9F, 0x4E, 0x51, 0xB2, 0x2F, + 0x2F, 0x2F, 0xB2, 0x51, 0xA3, 0x98, 0xA0, 0x55, + 0xA0, 0xA0, 0x8F, 0x66, 0x2F, 0x51, 0xB2, 0xA3, + 0xA3, 0x2A, 0x55, 0x98, 0xA3, 0x2F, 0xB2, 0x2F, + 0x66, 0x66, 0x2F, 0xB2, 0xD1, 0x2F, 0x2F, 0xA3, + 0xB2, 0xB2, 0xA3, 0x8F, 0xA3, 0x2F, 0xD1, 0x94, + 0xEC, 0x65, 0x65, 0xC0, 0xC0, 0x35, 0x95, 0xC2, + 0xA3, 0x98, 0x66, 0xA3, 0x2F, 0x2F, 0x2F, 0xA3, + 0xA3, 0x2F, 0xB2, 0x2F, 0x2F, 0x2F, 0x2F, 0x51, + 0x89, 0x44, 0xD1, 0x60, 0x35, 0xA9, 0x32, 0xC6, + 0xD7, 0x32, 0x94, 0x44, 0x2F, 0xB2, 0xB2, 0xB2, + 0xA3, 0x2F, 0xB2, 0x2F, 0xA3, 0x8F, 0xA0, 0xA0, + 0x55, 0xA0, 0x8F, 0xA3, 0x51, 0x51, 0x2F, 0xA3, + 0x8F, 0x2A, 0x55, 0x66, 0xA3, 0x2F, 0x2F, 0xB2, + 0xA3, 0x66, 0x2F, 0xB2, 0x51, 0xB2, 0x2F, 0x66, + 0xA3, 0xA3, 0x66, 0x8F, 0x8F, 0x8F, 0xA0, 0x2F, + 0x5E, 0xDF, 0xB9, 0x60, 0x95, 0xD3, 0x89, 0x2F, + 0xA3, 0x66, 0xA3, 0x2F, 0xB2, 0x2F, 0xA3, 0xA3, + 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0xB2, + 0x51, 0x2F, 0x8F, 0x2F, 0xC4, 0xB9, 0x9B, 0xEC, + 0x53, 0xB3, 0x4E, 0xA3, 0x2F, 0xB2, 0xB2, 0xB2, + 0xA3, 0x66, 0xA3, 0xA3, 0x66, 0x8F, 0x8F, 0x8F, + 0x8F, 0x8F, 0xA3, 0x51, 0x89, 0x51, 0xA3, 0x66, + 0xA0, 0x55, 0x8F, 0xA3, 0x2F, 0x2F, 0x2F, 0xB2, + 0x2F, 0xA3, 0x2F, 0x51, 0x51, 0xB2, 0xA3, 0x66, + 0x66, 0xA3, 0x66, 0x66, 0x66, 0x66, 0x66, 0xA3, + 0xB2, 0xC2, 0x74, 0xD8, 0xB2, 0xA3, 0xA3, 0xA3, + 0x66, 0x66, 0x2F, 0x2F, 0xA3, 0x66, 0x66, 0x66, + 0xA3, 0xA3, 0xB2, 0xB2, 0xB2, 0xB2, 0x2F, 0xB2, + 0x2F, 0x66, 0xA0, 0x55, 0x98, 0x2F, 0x89, 0x89, + 0x89, 0xB2, 0x2F, 0xA3, 0x2F, 0x51, 0x51, 0xB2, + 0x2F, 0x66, 0xA3, 0xA3, 0x66, 0x66, 0x66, 0x66, + 0x66, 0xA3, 0xB2, 0x89, 0xD8, 0x51, 0xA3, 0x98, + 0x66, 0x98, 0x66, 0x2F, 0x2F, 0x2F, 0x2F, 0xB2, + 0xB2, 0xA3, 0xA3, 0xB2, 0xB2, 0xB2, 0x2F, 0xA3, + 0x66, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0xB2, + 0x89, 0xD8, 0x89, 0x2F, 0x66, 0x66, 0xA3, 0xA3, + 0x98, 0x98, 0x66, 0x66, 0x98, 0x98, 0x66, 0xA3, + 0x2F, 0xA3, 0xB2, 0xB2, 0xB2, 0xB2, 0x2F, 0x2F, + 0xB2, 0x2F, 0x66, 0x98, 0x66, 0xA3, 0x2F, 0x2F, + 0x2F, 0xB2, 0x2F, 0xA3, 0xA3, 0xB2, 0xB2, 0x2F, + 0x2F, 0x66, 0x66, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, + 0x2F, 0xB2, 0x89, 0xD8, 0x44, 0x2F, 0x66, 0x66, + 0xA3, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0x2F, + 0x2F, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, 0xA3, + 0x66, 0xA3, 0x2F, 0xB2, 0xB2, 0xB2, 0x51, 0x51, + 0x89, 0x89, 0xB2, 0xA3, 0x98, 0x66, 0xA3, 0x66, + 0x98, 0x98, 0x98, 0x98, 0x98, 0x66, 0xA3, 0x2F, + 0xA3, 0x2F, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, 0xB2, + 0xB2, 0x2F, 0xA3, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, + 0x2F, 0xB2, 0xB2, 0xA3, 0xA3, 0x2F, 0x2F, 0x2F, + 0x2F, 0xA3, 0x66, 0xA3, 0x2F, 0xB2, 0xB2, 0xB2, + 0x51, 0x51, 0x89, 0x89, 0xB2, 0xA3, 0x98, 0x66 }; unsigned char linux_logo_bw[] __initdata = { @@ -1021,22 +1026,22 @@ unsigned char linux_logo_bw[] __initdata = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, }; -/* Painted by Johnny Stenback <jst@uwasa.fi> */ +unsigned char linux_logo16_red[0]; +unsigned char linux_logo16_green[0]; +unsigned char linux_logo16_blue[0]; +unsigned char linux_logo16[0]; + +#else + +/* prototypes only */ +extern unsigned char linux_logo_red[]; +extern unsigned char linux_logo_green[]; +extern unsigned char linux_logo_blue[]; +extern unsigned char linux_logo[]; +extern unsigned char linux_logo_bw[]; +extern unsigned char linux_logo16_red[]; +extern unsigned char linux_logo16_green[]; +extern unsigned char linux_logo16_blue[]; +extern unsigned char linux_logo16[]; -unsigned char *linux_serial_image __initdata = "\n" -" .u$e.\n" -" .$$$$$:S\n" -" $\"*$/\"*$$\n" -" $.`$ . ^F\n" -" 4k+#+T.$F\n" -" 4P+++\"$\"$\n" -" :R\"+ t$$B\n" -" ___# $$$\n" -" | | R$$k\n" -" dd. | Linux $!$\n" -" ddd | Sparc $9$F\n" -" '!!!!!$ !!#!`\n" -" !!!!!* .!!!!!`\n" -"'!!!!!!!W..e$$!!!!!!` %s\n" -" \"~^^~ ^~~^\n" -"\n"; +#endif diff --git a/include/asm-sparc64/mmu_context.h b/include/asm-sparc64/mmu_context.h index 44209a120..1d8a9f7ee 100644 --- a/include/asm-sparc64/mmu_context.h +++ b/include/asm-sparc64/mmu_context.h @@ -1,4 +1,4 @@ -/* $Id: mmu_context.h,v 1.20 1997/09/18 10:42:08 rth Exp $ */ +/* $Id: mmu_context.h,v 1.26 1998/07/31 10:42:38 jj Exp $ */ #ifndef __SPARC64_MMU_CONTEXT_H #define __SPARC64_MMU_CONTEXT_H @@ -6,70 +6,80 @@ #include <asm/system.h> #include <asm/spitfire.h> +#include <asm/spinlock.h> #define NO_CONTEXT 0 #ifndef __ASSEMBLY__ extern unsigned long tlb_context_cache; +extern spinlock_t scheduler_lock; +extern unsigned long mmu_context_bmap[]; -#define CTX_VERSION_SHIFT PAGE_SHIFT +#define CTX_VERSION_SHIFT (PAGE_SHIFT - 3) #define CTX_VERSION_MASK ((~0UL) << CTX_VERSION_SHIFT) #define CTX_FIRST_VERSION ((1UL << CTX_VERSION_SHIFT) + 1UL) -extern void get_new_mmu_context(struct mm_struct *mm, unsigned long *ctx); +extern void get_new_mmu_context(struct mm_struct *mm); /* Initialize/destroy the context related info for a new mm_struct * instance. */ #define init_new_context(mm) ((mm)->context = NO_CONTEXT) -#define destroy_context(mm) ((mm)->context = NO_CONTEXT) - -#ifdef __SMP__ -#define LOCAL_FLUSH_PENDING(cpu) \ - ((cpu_data[(cpu)].last_tlbversion_seen ^ tlb_context_cache) & CTX_VERSION_MASK) -#define DO_LOCAL_FLUSH(cpu) do { __flush_tlb_all(); \ - cpu_data[cpu].last_tlbversion_seen = \ - tlb_context_cache & CTX_VERSION_MASK; \ - } while(0) -#else -#define LOCAL_FLUSH_PENDING(cpu) 0 -#define DO_LOCAL_FLUSH(cpu) do { __flush_tlb_all(); } while(0) -#endif - -extern void __flush_tlb_all(void); +#define destroy_context(mm) do { \ + if ((mm)->context != NO_CONTEXT) { \ + spin_lock(&scheduler_lock); \ + if (!(((mm)->context ^ tlb_context_cache) & CTX_VERSION_MASK)) \ + clear_bit((mm)->context & ~(CTX_VERSION_MASK), \ + mmu_context_bmap); \ + spin_unlock(&scheduler_lock); \ + (mm)->context = NO_CONTEXT; \ + } \ +} while (0) extern __inline__ void get_mmu_context(struct task_struct *tsk) { register unsigned long paddr asm("o5"); + register unsigned long pgd_cache asm("o4"); struct mm_struct *mm = tsk->mm; flushw_user(); - if(LOCAL_FLUSH_PENDING(current->processor)) - DO_LOCAL_FLUSH(current->processor); if(!(tsk->tss.flags & SPARC_FLAG_KTHREAD) && !(tsk->flags & PF_EXITING)) { unsigned long ctx = tlb_context_cache; if((mm->context ^ ctx) & CTX_VERSION_MASK) - get_new_mmu_context(mm, &tlb_context_cache); - + get_new_mmu_context(mm); + if(!(mm->cpu_vm_mask & (1UL<<smp_processor_id()))) { + spitfire_set_secondary_context(mm->context & 0x3ff); + __asm__ __volatile__("flush %g6"); + spitfire_flush_dtlb_secondary_context(); + spitfire_flush_itlb_secondary_context(); + __asm__ __volatile__("flush %g6"); + } /* Don't worry, set_fs() will restore it... */ /* Sigh, damned include loops... just poke seg directly. */ tsk->tss.ctx = (tsk->tss.current_ds.seg ? - (mm->context & 0x1fff) : 0); + (mm->context & 0x3ff) : 0); } else tsk->tss.ctx = 0; spitfire_set_secondary_context(tsk->tss.ctx); __asm__ __volatile__("flush %g6"); paddr = __pa(mm->pgd); + if(tsk->tss.flags & SPARC_FLAG_32BIT) + pgd_cache = (unsigned long) mm->pgd[0]; + else + pgd_cache = 0; __asm__ __volatile__(" - rdpr %%pstate, %%o4 - wrpr %%o4, %1, %%pstate + rdpr %%pstate, %%o3 + wrpr %%o3, %2, %%pstate + mov %4, %%g4 mov %0, %%g7 - wrpr %%o4, 0x0, %%pstate + stxa %1, [%%g4] %3 + wrpr %%o3, 0x0, %%pstate " : /* no outputs */ - : "r" (paddr), "i" (PSTATE_MG|PSTATE_IE) - : "o4"); + : "r" (paddr), "r" (pgd_cache), "i" (PSTATE_MG|PSTATE_IE), + "i" (ASI_DMMU), "i" (TSB_REG) + : "o3"); } /* diff --git a/include/asm-sparc64/page.h b/include/asm-sparc64/page.h index 86ec1477d..fe33651cf 100644 --- a/include/asm-sparc64/page.h +++ b/include/asm-sparc64/page.h @@ -1,4 +1,4 @@ -/* $Id: page.h,v 1.17 1998/01/14 17:16:28 jj Exp $ */ +/* $Id: page.h,v 1.23 1998/06/12 14:54:33 jj Exp $ */ #ifndef _SPARC64_PAGE_H #define _SPARC64_PAGE_H @@ -13,12 +13,12 @@ #define PAGE_MASK (~(PAGE_SIZE-1)) + #ifdef __KERNEL__ #ifndef __ASSEMBLY__ -#define clear_page(page) memset((void *)(page), 0, PAGE_SIZE) - +#define clear_page(page) memset((void *)(page), 0, PAGE_SIZE) extern void copy_page(unsigned long to, unsigned long from); /* GROSS, defining this makes gcc pass these types as aggregates, @@ -82,8 +82,7 @@ typedef unsigned long iopgprot_t; #endif /* (STRICT_MM_TYPECHECKS) */ #define TASK_UNMAPPED_BASE ((current->tss.flags & SPARC_FLAG_32BIT) ? \ - (0x0000000070000000UL) : \ - (0xfffff80000000000UL)) + (0x0000000070000000UL) : (PAGE_OFFSET)) #endif /* !(__ASSEMBLY__) */ diff --git a/include/asm-sparc64/pbm.h b/include/asm-sparc64/pbm.h index 3adcc9583..adb1e10bf 100644 --- a/include/asm-sparc64/pbm.h +++ b/include/asm-sparc64/pbm.h @@ -1,4 +1,4 @@ -/* $Id: pbm.h,v 1.12 1998/04/10 12:29:55 ecd Exp $ +/* $Id: pbm.h,v 1.14 1998/05/29 06:00:40 ecd Exp $ * pbm.h: U2P PCI bus module pseudo driver software state. * * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu) @@ -74,46 +74,13 @@ struct pcidev_cookie { int prom_node; }; -extern struct linux_psycho *psycho_root; -extern struct linux_psycho **psycho_index_map; -extern int linux_num_psycho; -static __inline__ struct linux_psycho * -psycho_by_index(int index) -{ - if (index >= linux_num_psycho) - return NULL; - return psycho_index_map[index]; -} +#define PCI_IRQ_IGN 0x000007c0 /* PSYCHO "Int Group Number". */ +#define PCI_IRQ_INO 0x0000003f /* PSYCHO INO. */ -/* Special PCI IRQ encoding, this just makes life easier for the generic - * irq registry layer, there is already enough crap in there due to sbus, - * fhc, and dcookies. - */ -#define PCI_IRQ_IDENT 0x80000000 /* This tells irq.c what we are */ -#define PCI_IRQ_IMAP_OFF 0x7ff00000 /* Offset from first PSYCHO imap */ -#define PCI_IRQ_IMAP_OFF_SHFT 20 -#define PCI_IRQ_BUSNO 0x000fc000 /* PSYCHO instance */ -#define PCI_IRQ_BUSNO_SHFT 14 -#define PCI_IRQ_IGN 0x000007c0 /* PSYCHO "Int Group Number" */ -#define PCI_IRQ_INO 0x0000003f /* PSYCHO INO */ - -#define PCI_IRQ_P(__irq) (((__irq) & PCI_IRQ_IDENT) != 0) - -extern __inline__ unsigned int pci_irq_encode(unsigned long imap_off, - unsigned long psycho_instance, - unsigned long ign, - unsigned long ino) -{ - unsigned int irq; - - irq = PCI_IRQ_IDENT; - irq |= ((imap_off << PCI_IRQ_IMAP_OFF_SHFT) & PCI_IRQ_IMAP_OFF); - irq |= ((psycho_instance << PCI_IRQ_BUSNO_SHFT) & PCI_IRQ_BUSNO); - irq |= ((ign << 6) & PCI_IRQ_IGN); - irq |= (ino & PCI_IRQ_INO); - - return irq; -} +/* Used by EBus */ +extern unsigned int psycho_irq_build(struct linux_pbm_info *pbm, + struct pci_dev *pdev, + unsigned int full_ino); #endif /* !(__SPARC64_PBM_H) */ diff --git a/include/asm-sparc64/pgtable.h b/include/asm-sparc64/pgtable.h index c57eb06cf..2bc6695b7 100644 --- a/include/asm-sparc64/pgtable.h +++ b/include/asm-sparc64/pgtable.h @@ -1,4 +1,4 @@ -/* $Id: pgtable.h,v 1.64 1998/02/16 14:06:44 jj Exp $ +/* $Id: pgtable.h,v 1.85 1998/08/04 20:51:33 davem Exp $ * pgtable.h: SpitFire page table operations. * * Copyright 1996,1997 David S. Miller (davem@caip.rutgers.edu) @@ -41,10 +41,20 @@ /* Entries per page directory level. */ #define PTRS_PER_PTE (1UL << (PAGE_SHIFT-3)) -#define PTRS_PER_PMD (1UL << (PAGE_SHIFT-2)) -/* We cannot use the top 16G because a half of mm/ would break, so why to check it */ + +/* We the first one in this file, what we export to the kernel + * is different so we can optimize correctly for 32-bit tasks. + */ +#define REAL_PTRS_PER_PMD (1UL << (PAGE_SHIFT-2)) +#define PTRS_PER_PMD ((const int)((current->tss.flags & SPARC_FLAG_32BIT) ? \ + (REAL_PTRS_PER_PMD >> 2) : (REAL_PTRS_PER_PMD))) + +/* We cannot use the top 16G because VPTE table lives there. */ #define PTRS_PER_PGD ((1UL << (PAGE_SHIFT-3))-1) -#define USER_PTRS_PER_PGD PTRS_PER_PGD /* Kernel has a separate 44bit address space */ + +/* Kernel has a separate 44bit address space. */ +#define USER_PTRS_PER_PGD ((const int)((current->tss.flags & SPARC_FLAG_32BIT) ? \ + (1) : (PTRS_PER_PGD))) #define PTE_TABLE_SIZE 0x2000 /* 1024 entries 8 bytes each */ #define PMD_TABLE_SIZE 0x2000 /* 2048 entries 4 bytes each */ @@ -54,8 +64,9 @@ #define PTRS_PER_PAGE (1UL << (PAGE_SHIFT-3)) /* NOTE: TLB miss handlers depend heavily upon where this is. */ -#define VMALLOC_START 0x0000000800000000UL +#define VMALLOC_START 0x0000000140000000UL #define VMALLOC_VMADDR(x) ((unsigned long)(x)) +#define VMALLOC_END 0x0000000200000000UL #endif /* !(__ASSEMBLY__) */ @@ -93,8 +104,7 @@ #define __ACCESS_BITS (_PAGE_ACCESSED | _PAGE_READ | _PAGE_R) #define __PRIV_BITS _PAGE_P -#define PAGE_NONE __pgprot (_PAGE_PRESENT | _PAGE_VALID | _PAGE_CACHE | \ - __PRIV_BITS | __ACCESS_BITS) +#define PAGE_NONE __pgprot (_PAGE_PRESENT | _PAGE_ACCESSED) #define PAGE_SHARED __pgprot (_PAGE_PRESENT | _PAGE_VALID | _PAGE_CACHE | \ __ACCESS_BITS | _PAGE_W | _PAGE_WRITE) @@ -137,11 +147,7 @@ #ifndef __ASSEMBLY__ extern pte_t __bad_page(void); -extern pmd_t *__bad_pmd(void); -extern pte_t *__bad_pte(void); -#define BAD_PMD __bad_pmd() -#define BAD_PTE __bad_pte() #define BAD_PAGE __bad_page() /* First physical page can be anywhere, the following is needed so that @@ -151,12 +157,9 @@ extern pte_t *__bad_pte(void); extern unsigned long phys_base; #define ZERO_PAGE ((unsigned long)__va(phys_base)) -/* This is for making TLB miss faster to process. */ -#define null_pmd_table (null_pte_table - PAGE_SIZE) -extern unsigned int null_pte_table; - /* Allocate a block of RAM which is aligned to its size. - This procedure can be used until the call to mem_init(). */ + * This procedure can be used until the call to mem_init(). + */ extern void *sparc_init_alloc(unsigned long *kbrk, unsigned long size); /* Cache and TLB flush operations. */ @@ -173,36 +176,38 @@ extern void *sparc_init_alloc(unsigned long *kbrk, unsigned long size); extern void __flush_cache_all(void); extern void __flush_tlb_all(void); -extern void __flush_tlb_mm(unsigned long context); +extern void __flush_tlb_mm(unsigned long context, unsigned long r); extern void __flush_tlb_range(unsigned long context, unsigned long start, - unsigned long end); -extern void __flush_tlb_page(unsigned long context, unsigned long page); + unsigned long r, unsigned long end, + unsigned long pgsz, unsigned long size); +extern void __flush_tlb_page(unsigned long context, unsigned long page, unsigned long r); #ifndef __SMP__ #define flush_cache_all() __flush_cache_all() #define flush_tlb_all() __flush_tlb_all() -extern __inline__ void flush_tlb_mm(struct mm_struct *mm) -{ - if(mm->context != NO_CONTEXT) - __flush_tlb_mm(mm->context & 0x1fff); -} - -extern __inline__ void flush_tlb_range(struct mm_struct *mm, unsigned long start, - unsigned long end) -{ - if(mm->context != NO_CONTEXT) - __flush_tlb_range(mm->context & 0x1fff, start, end); -} - -extern __inline__ void flush_tlb_page(struct vm_area_struct *vma, unsigned long page) -{ - struct mm_struct *mm = vma->vm_mm; - - if(mm->context != NO_CONTEXT) - __flush_tlb_page(mm->context & 0x1fff, page & PAGE_MASK); -} +#define flush_tlb_mm(mm) \ +do { if((mm)->context != NO_CONTEXT) \ + __flush_tlb_mm((mm)->context & 0x3ff, SECONDARY_CONTEXT); \ +} while(0) + +#define flush_tlb_range(mm, start, end) \ +do { if((mm)->context != NO_CONTEXT) { \ + unsigned long __start = (start)&PAGE_MASK; \ + unsigned long __end = (end)&PAGE_MASK; \ + __flush_tlb_range((mm)->context & 0x3ff, __start, \ + SECONDARY_CONTEXT, __end, PAGE_SIZE, \ + (__end - __start)); \ + } \ +} while(0) + +#define flush_tlb_page(vma, page) \ +do { struct mm_struct *__mm = (vma)->vm_mm; \ + if(__mm->context != NO_CONTEXT) \ + __flush_tlb_page(__mm->context & 0x3ff, (page)&PAGE_MASK, \ + SECONDARY_CONTEXT); \ +} while(0) #else /* __SMP__ */ @@ -239,105 +244,74 @@ extern __inline__ void flush_tlb_page(struct vm_area_struct *vma, unsigned long #endif -extern inline pte_t mk_pte(unsigned long page, pgprot_t pgprot) -{ return __pte(__pa(page) | pgprot_val(pgprot)); } - -extern inline pte_t mk_pte_phys(unsigned long physpage, pgprot_t pgprot) -{ return __pte(physpage | pgprot_val(pgprot)); } - -extern inline pte_t pte_modify(pte_t pte, pgprot_t newprot) -{ pte_val(pte) = (pte_val(pte) & _PAGE_CHG_MASK) | pgprot_val(newprot); return pte; } - -extern inline void pmd_set(pmd_t *pmdp, pte_t *ptep) -{ pmd_val(*pmdp) = __pa((unsigned long) ptep); } - -extern inline void pgd_set(pgd_t *pgdp, pmd_t *pmdp) -{ pgd_val(*pgdp) = __pa((unsigned long) pmdp); } - -extern inline unsigned long pte_page(pte_t pte) -{ return (unsigned long) __va((pte_val(pte) & _PFN_MASK)); } - -extern inline unsigned long pmd_page(pmd_t pmd) -{ return (unsigned long) __va(pmd_val(pmd)); } - -extern inline unsigned long pgd_page(pgd_t pgd) -{ return (unsigned long) __va(pgd_val(pgd)); } - -#define PMD_NONE_MAGIC 0x40 -#define PGD_NONE_MAGIC 0x40 - -extern inline int pte_none(pte_t pte) { return !pte_val(pte); } -extern inline int pte_present(pte_t pte) { return pte_val(pte) & _PAGE_PRESENT; } -extern inline void pte_clear(pte_t *pte) { pte_val(*pte) = 0; } - -extern inline int pmd_none(pmd_t pmd) { return pmd_val(pmd)&PMD_NONE_MAGIC; } -extern inline int pmd_bad(pmd_t pmd) { return 0; } -extern inline int pmd_present(pmd_t pmd) { return !(pmd_val(pmd)&PMD_NONE_MAGIC);} -extern inline void pmd_clear(pmd_t *pmdp) { pmd_val(*pmdp) = null_pte_table; } - -extern inline int pgd_none(pgd_t pgd) { return pgd_val(pgd) & PGD_NONE_MAGIC; } -extern inline int pgd_bad(pgd_t pgd) { return 0; } -extern inline int pgd_present(pgd_t pgd) { return !(pgd_val(pgd)&PGD_NONE_MAGIC);} -extern inline void pgd_clear(pgd_t *pgdp) { pgd_val(*pgdp) = null_pmd_table; } +#define mk_pte(page, pgprot) (__pte(__pa(page) | pgprot_val(pgprot))) +#define mk_pte_phys(physpage, pgprot) (__pte((physpage) | pgprot_val(pgprot))) +#define pte_modify(_pte, newprot) \ + (pte_val(_pte) = ((pte_val(_pte) & _PAGE_CHG_MASK) | pgprot_val(newprot))) +#define pmd_set(pmdp, ptep) (pmd_val(*(pmdp)) = __pa((unsigned long) (ptep))) +#define pgd_set(pgdp, pmdp) (pgd_val(*(pgdp)) = __pa((unsigned long) (pmdp))) +#define pte_page(pte) ((unsigned long) __va(((pte_val(pte)&~PAGE_OFFSET)&~(0xfffUL)))) +#define pmd_page(pmd) ((unsigned long) __va(pmd_val(pmd))) +#define pgd_page(pgd) ((unsigned long) __va(pgd_val(pgd))) +#define pte_none(pte) (!pte_val(pte)) +#define pte_present(pte) (pte_val(pte) & _PAGE_PRESENT) +#define pte_clear(pte) (pte_val(*(pte)) = 0UL) +#define pmd_none(pmd) (!pmd_val(pmd)) +#define pmd_bad(pmd) (0) +#define pmd_present(pmd) (pmd_val(pmd) != 0UL) +#define pmd_clear(pmdp) (pmd_val(*(pmdp)) = 0UL) +#define pgd_none(pgd) (!pgd_val(pgd)) +#define pgd_bad(pgd) (0) +#define pgd_present(pgd) (pgd_val(pgd) != 0UL) +#define pgd_clear(pgdp) (pgd_val(*(pgdp)) = 0UL) /* The following only work if pte_present() is true. * Undefined behaviour if not.. */ -extern inline int pte_read(pte_t pte) { return pte_val(pte) & _PAGE_READ; } -extern inline int pte_write(pte_t pte) { return pte_val(pte) & _PAGE_WRITE; } -extern inline int pte_dirty(pte_t pte) { return pte_val(pte) & _PAGE_MODIFIED; } -extern inline int pte_young(pte_t pte) { return pte_val(pte) & _PAGE_ACCESSED; } - -extern inline pte_t pte_wrprotect(pte_t pte) -{ return __pte(pte_val(pte) & ~(_PAGE_WRITE|_PAGE_W)); } - -extern inline pte_t pte_rdprotect(pte_t pte) -{ return __pte(pte_val(pte) & ~(_PAGE_READ|_PAGE_R)); } - -extern inline pte_t pte_mkclean(pte_t pte) -{ return __pte(pte_val(pte) & ~(_PAGE_MODIFIED | _PAGE_W)); } - -extern inline pte_t pte_mkold(pte_t pte) -{ return __pte(pte_val(pte) & ~(_PAGE_ACCESSED | _PAGE_R)); } - -extern inline pte_t pte_mkwrite(pte_t pte) -{ - if(pte_val(pte) & _PAGE_MODIFIED) - return __pte(pte_val(pte) | (_PAGE_WRITE | _PAGE_W)); +#define pte_read(pte) (pte_val(pte) & _PAGE_READ) +#define pte_write(pte) (pte_val(pte) & _PAGE_WRITE) +#define pte_dirty(pte) (pte_val(pte) & _PAGE_MODIFIED) +#define pte_young(pte) (pte_val(pte) & _PAGE_ACCESSED) +#define pte_wrprotect(pte) (__pte(pte_val(pte) & ~(_PAGE_WRITE|_PAGE_W))) +#define pte_rdprotect(pte) (__pte(((pte_val(pte)<<1UL)>>1UL) & ~_PAGE_READ)) +#define pte_mkclean(pte) (__pte(pte_val(pte) & ~(_PAGE_MODIFIED|_PAGE_W))) +#define pte_mkold(pte) (__pte(((pte_val(pte)<<1UL)>>1UL) & ~_PAGE_ACCESSED)) + +/* Be very careful when you change these three, they are delicate. */ +static __inline__ pte_t pte_mkyoung(pte_t _pte) +{ if(pte_val(_pte) & _PAGE_READ) + return __pte(pte_val(_pte)|(_PAGE_ACCESSED|_PAGE_R)); else - return __pte(pte_val(pte) | (_PAGE_WRITE)); + return __pte(pte_val(_pte)|(_PAGE_ACCESSED)); } -extern inline pte_t pte_mkdirty(pte_t pte) -{ - if(pte_val(pte) & _PAGE_WRITE) - return __pte(pte_val(pte) | (_PAGE_MODIFIED | _PAGE_W)); +static __inline__ pte_t pte_mkwrite(pte_t _pte) +{ if(pte_val(_pte) & _PAGE_MODIFIED) + return __pte(pte_val(_pte)|(_PAGE_WRITE|_PAGE_W)); else - return __pte(pte_val(pte) | (_PAGE_MODIFIED)); + return __pte(pte_val(_pte)|(_PAGE_WRITE)); } -extern inline pte_t pte_mkyoung(pte_t pte) -{ - if(pte_val(pte) & _PAGE_READ) - return __pte(pte_val(pte) | (_PAGE_ACCESSED | _PAGE_R)); +static __inline__ pte_t pte_mkdirty(pte_t _pte) +{ if(pte_val(_pte) & _PAGE_WRITE) + return __pte(pte_val(_pte)|(_PAGE_MODIFIED|_PAGE_W)); else - return __pte(pte_val(pte) | (_PAGE_ACCESSED)); + return __pte(pte_val(_pte)|(_PAGE_MODIFIED)); } /* to find an entry in a page-table-directory. */ -extern inline pgd_t *pgd_offset(struct mm_struct *mm, unsigned long address) -{ return mm->pgd + ((address >> PGDIR_SHIFT) & (PTRS_PER_PGD)); } +#define pgd_offset(mm, address) ((mm)->pgd + ((address >> PGDIR_SHIFT) & (PTRS_PER_PGD))) /* to find an entry in a kernel page-table-directory */ #define pgd_offset_k(address) pgd_offset(&init_mm, address) /* Find an entry in the second-level page table.. */ -extern inline pmd_t *pmd_offset(pgd_t *dir, unsigned long address) -{ return (pmd_t *) pgd_page(*dir) + ((address >> PMD_SHIFT) & (PTRS_PER_PMD - 1)); } +#define pmd_offset(dir, address) ((pmd_t *) pgd_page(*(dir)) + \ + ((address >> PMD_SHIFT) & (REAL_PTRS_PER_PMD-1))) /* Find an entry in the third-level page table.. */ -extern inline pte_t *pte_offset(pmd_t *dir, unsigned long address) -{ return (pte_t *) pmd_page(*dir) + ((address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)); } +#define pte_offset(dir, address) ((pte_t *) pmd_page(*(dir)) + \ + ((address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))) /* Very stupidly, we used to get new pgd's and pmd's, init their contents * to point to the NULL versions of the next level page table, later on @@ -352,31 +326,68 @@ extern inline pte_t *pte_offset(pmd_t *dir, unsigned long address) #else extern struct pgtable_cache_struct { unsigned long *pgd_cache; - unsigned long *pmd_cache; unsigned long *pte_cache; unsigned long pgcache_size; + unsigned long pgdcache_size; } pgt_quicklists; #endif #define pgd_quicklist (pgt_quicklists.pgd_cache) -#define pmd_quicklist (pgt_quicklists.pmd_cache) +#define pmd_quicklist ((unsigned long *)0) #define pte_quicklist (pgt_quicklists.pte_cache) #define pgtable_cache_size (pgt_quicklists.pgcache_size) +#define pgd_cache_size (pgt_quicklists.pgdcache_size) -extern pgd_t *get_pgd_slow(void); +#ifndef __SMP__ -extern __inline__ pgd_t *get_pgd_fast(void) +extern __inline__ void free_pgd_fast(pgd_t *pgd) { - unsigned long *ret; + struct page *page = mem_map + MAP_NR(pgd); - if((ret = pgd_quicklist) != NULL) { - pgd_quicklist = (unsigned long *)(*ret); - ret[0] = ret[1]; - pgtable_cache_size--; - } else - ret = (unsigned long *)get_pgd_slow(); - return (pgd_t *)ret; + if (!page->pprev_hash) { + (unsigned long *)page->next_hash = pgd_quicklist; + pgd_quicklist = (unsigned long *)page; + } + (unsigned long)page->pprev_hash |= + (((unsigned long)pgd & (PAGE_SIZE / 2)) ? 2 : 1); + pgd_cache_size++; } +extern __inline__ pgd_t *get_pgd_fast(void) +{ + struct page *ret; + + if ((ret = (struct page *)pgd_quicklist) != NULL) { + unsigned long mask = (unsigned long)ret->pprev_hash; + unsigned long off = 0; + + if (mask & 1) + mask &= ~1; + else { + off = PAGE_SIZE / 2; + mask &= ~2; + } + (unsigned long)ret->pprev_hash = mask; + if (!mask) + pgd_quicklist = (unsigned long *)ret->next_hash; + ret = (struct page *)(PAGE_OFFSET + (ret->map_nr << PAGE_SHIFT) + off); + pgd_cache_size--; + } else { + ret = (struct page *) __get_free_page(GFP_KERNEL); + if(ret) { + struct page *page = mem_map + MAP_NR(ret); + + clear_page(ret); + (unsigned long)page->pprev_hash = 2; + (unsigned long *)page->next_hash = pgd_quicklist; + pgd_quicklist = (unsigned long *)page; + pgd_cache_size++; + } + } + return (pgd_t *)ret; +} + +#else /* __SMP__ */ + extern __inline__ void free_pgd_fast(pgd_t *pgd) { *(unsigned long *)pgd = (unsigned long) pgd_quicklist; @@ -384,20 +395,38 @@ extern __inline__ void free_pgd_fast(pgd_t *pgd) pgtable_cache_size++; } +extern __inline__ pgd_t *get_pgd_fast(void) +{ + unsigned long *ret; + + if((ret = pgd_quicklist) != NULL) { + pgd_quicklist = (unsigned long *)(*ret); + ret[0] = 0; + pgtable_cache_size--; + } else { + ret = (unsigned long *) __get_free_page(GFP_KERNEL); + if(ret) + clear_page(ret); + } + return (pgd_t *)ret; +} + extern __inline__ void free_pgd_slow(pgd_t *pgd) { free_page((unsigned long)pgd); } +#endif /* __SMP__ */ + extern pmd_t *get_pmd_slow(pgd_t *pgd, unsigned long address_premasked); extern __inline__ pmd_t *get_pmd_fast(void) { unsigned long *ret; - if((ret = (unsigned long *)pmd_quicklist) != NULL) { - pmd_quicklist = (unsigned long *)(*ret); - ret[0] = ret[1]; + if((ret = (unsigned long *)pte_quicklist) != NULL) { + pte_quicklist = (unsigned long *)(*ret); + ret[0] = 0; pgtable_cache_size--; } return (pmd_t *)ret; @@ -405,8 +434,8 @@ extern __inline__ pmd_t *get_pmd_fast(void) extern __inline__ void free_pmd_fast(pgd_t *pmd) { - *(unsigned long *)pmd = (unsigned long) pmd_quicklist; - pmd_quicklist = (unsigned long *) pmd; + *(unsigned long *)pmd = (unsigned long) pte_quicklist; + pte_quicklist = (unsigned long *) pmd; pgtable_cache_size++; } @@ -423,7 +452,7 @@ extern __inline__ pte_t *get_pte_fast(void) if((ret = (unsigned long *)pte_quicklist) != NULL) { pte_quicklist = (unsigned long *)(*ret); - ret[0] = ret[1]; + ret[0] = 0; pgtable_cache_size--; } return (pte_t *)ret; @@ -464,7 +493,7 @@ extern inline pte_t * pte_alloc(pmd_t *pmd, unsigned long address) extern inline pmd_t * pmd_alloc(pgd_t *pgd, unsigned long address) { - address = (address >> PMD_SHIFT) & (PTRS_PER_PMD - 1); + address = (address >> PMD_SHIFT) & (REAL_PTRS_PER_PMD - 1); if (pgd_none(*pgd)) { pmd_t *page = get_pmd_fast(); @@ -479,12 +508,12 @@ extern inline pmd_t * pmd_alloc(pgd_t *pgd, unsigned long address) #define pte_alloc_kernel(pmd, addr) pte_alloc(pmd, addr) #define pmd_alloc_kernel(pgd, addr) pmd_alloc(pgd, addr) -extern inline void set_pgdir(unsigned long address, pgd_t entry) -{ - /* Nothing to do on sparc64 :) */ -} +extern int do_check_pgt_cache(int, int); -extern pgd_t swapper_pg_dir[1024]; +/* Nothing to do on sparc64 :) */ +#define set_pgdir(address, entry) do { } while(0) + +extern pgd_t swapper_pg_dir[1]; extern inline void SET_PAGE_DIR(struct task_struct *tsk, pgd_t *pgdir) { @@ -526,35 +555,26 @@ extern void mmu_release_scsi_sgl(struct mmu_sglist *sg, int sz, struct linux_sbu #define mmu_lockarea(vaddr, len) (vaddr) #define mmu_unlockarea(vaddr, len) do { } while(0) -extern __inline__ void update_mmu_cache(struct vm_area_struct *vma, - unsigned long address, pte_t pte) -{ - struct mm_struct *mm = vma->vm_mm; - unsigned long ctx = mm->context & 0x1fff; - unsigned long tag_access; - - tag_access = address | ctx; - - __asm__ __volatile__(" - rdpr %%pstate, %%g1 - wrpr %%g1, %0, %%pstate - brz,pt %1, 1f - mov %2, %%g2 - stxa %3, [%%g2] %5 - b,pt %%xcc, 2f - stxa %4, [%%g0] %6 -1: - stxa %3, [%%g2] %7 - stxa %4, [%%g0] %8 -2: - wrpr %%g1, 0x0, %%pstate -" : /* no outputs */ - : "i" (PSTATE_IE), "r" (vma->vm_flags & VM_EXEC), - "i" (TLB_TAG_ACCESS), "r" (tag_access), "r" (pte_val(pte)), - "i" (ASI_IMMU), "i" (ASI_ITLB_DATA_IN), - "i" (ASI_DMMU), "i" (ASI_DTLB_DATA_IN) - : "g1", "g2"); -} +#define update_mmu_cache(__vma, __address, _pte) \ +__asm__ __volatile__( \ + "rdpr %%pstate, %%g1\n\t" \ + "wrpr %%g1, %0, %%pstate\n\t" \ + "brz,pt %1, 1f\n\t" \ + " mov %2, %%g2\n\t" \ + "stxa %3, [%%g2] %5\n\t" \ + "ba,pt %%xcc, 2f\n\t" \ + " stxa %4, [%%g0] %6\n\t" \ +"1: stxa %3, [%%g2] %7\n\t" \ +" stxa %4, [%%g0] %8\n\t" \ +"2: wrpr %%g1, 0x0, %%pstate\n" \ + : /* no outputs */ \ + : "i" (PSTATE_IE), \ + "r" (((__vma)->vm_flags&(VM_READ|VM_WRITE|VM_EXEC))==(VM_READ|VM_EXEC)), \ + "i" (TLB_TAG_ACCESS), \ + "r" ((__address) | ((__vma)->vm_mm->context & 0x3ff)), \ + "r" (pte_val(_pte)), "i" (ASI_IMMU), "i" (ASI_ITLB_DATA_IN), \ + "i" (ASI_DMMU), "i" (ASI_DTLB_DATA_IN) \ + : "g1", "g2") /* Make a non-present pseudo-TTE. */ extern inline pte_t mk_swap_pte(unsigned long type, unsigned long offset) @@ -596,7 +616,6 @@ __get_iospace (unsigned long addr) extern void * module_map (unsigned long size); extern void module_unmap (void *addr); -extern void module_shrink (void *addr, unsigned long size); /* Needs to be defined here and not in linux/mm.h, as it is arch dependent */ #define PageSkip(page) (test_bit(PG_skip, &(page)->flags)) diff --git a/include/asm-sparc64/posix_types.h b/include/asm-sparc64/posix_types.h index dd09cb516..98b4125a6 100644 --- a/include/asm-sparc64/posix_types.h +++ b/include/asm-sparc64/posix_types.h @@ -7,7 +7,11 @@ * assume GCC is being used. */ +#if __GNUC_MINOR__ > 7 +typedef unsigned long int __kernel_size_t; +#else typedef unsigned long long __kernel_size_t; +#endif typedef long long __kernel_ssize_t; typedef long __kernel_ptrdiff_t; diff --git a/include/asm-sparc64/processor.h b/include/asm-sparc64/processor.h index fd1a5fc9a..ab4348216 100644 --- a/include/asm-sparc64/processor.h +++ b/include/asm-sparc64/processor.h @@ -1,4 +1,4 @@ -/* $Id: processor.h,v 1.42 1998/01/28 10:00:04 ecd Exp $ +/* $Id: processor.h,v 1.49 1998/07/31 10:42:40 jj Exp $ * include/asm-sparc64/processor.h * * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) @@ -31,22 +31,9 @@ #define TASK_SIZE 0xfffffffc00000000 #endif -#define COPY_TASK_STRUCT(dst, src) \ -do { \ - if (src->tss.w_saved) \ - *dst = *src; \ - else { \ - memcpy (dst, src, ((const unsigned long)(&((struct task_struct *)0)->tss.reg_window))); \ - memcpy ((char *)dst + ((const unsigned long)(&((struct task_struct *)0)->tss.sig_address)), \ - (char *)src + ((const unsigned long)(&((struct task_struct *)0)->tss.sig_address)), \ - sizeof(struct task_struct) - \ - ((const unsigned long)(&((struct task_struct *)0)->tss.sig_address))); \ - } \ -} while (0) - #ifndef __ASSEMBLY__ -#define NSWINS 8 +#define NSWINS 7 typedef struct { unsigned long seg; @@ -55,14 +42,14 @@ typedef struct { /* The Sparc processor specific thread struct. */ struct thread_struct { /*DC1*/ unsigned long ksp __attribute__ ((aligned(16))); - unsigned int kpc; unsigned short wstate; unsigned short cwp; - -/*DC2*/ unsigned short flags; + unsigned short flags; unsigned short ctx; - unsigned short w_saved; + +/*DC2*/ unsigned short w_saved; unsigned short new_signal; + unsigned int ___pad; mm_segment_t current_ds; /*DC3*/ struct pt_regs *kregs; @@ -73,35 +60,39 @@ struct thread_struct { unsigned long sig_address __attribute__ ((aligned (8))); unsigned long sig_desc; - struct sigstack sstk_info; + + unsigned char fpdepth; + unsigned char fpsaved[7]; + unsigned char gsr[7]; + unsigned long xfsr[7]; }; #endif /* !(__ASSEMBLY__) */ -#define SPARC_FLAG_USEDFPUL 0x01 /* Used f0-f31 */ -#define SPARC_FLAG_USEDFPUU 0x02 /* Used f32-f62 */ -#define SPARC_FLAG_USEDFPU 0x04 /* If ever FEF bit was set while TSTATE_PEF */ -#define SPARC_FLAG_KTHREAD 0x10 /* task is a kernel thread */ -#define SPARC_FLAG_UNALIGNED 0x20 /* is allowed to do unaligned accesses */ -#define SPARC_FLAG_NEWSIGNALS 0x40 /* task wants new-style signals */ -#define SPARC_FLAG_32BIT 0x80 /* task is older 32-bit binary */ +#define SPARC_FLAG_KTHREAD 0x010 /* task is a kernel thread */ +#define SPARC_FLAG_UNALIGNED 0x020 /* is allowed to do unaligned accesses */ +#define SPARC_FLAG_NEWSIGNALS 0x040 /* task wants new-style signals */ +#define SPARC_FLAG_32BIT 0x080 /* task is older 32-bit binary */ +#define SPARC_FLAG_NEWCHILD 0x100 /* task is just-spawned child process */ #define INIT_MMAP { &init_mm, 0xfffff80000000000, 0xfffff80001000000, \ PAGE_SHARED , VM_READ | VM_WRITE | VM_EXEC, NULL, &init_mm.mmap } #define INIT_TSS { \ -/* ksp, kpc, wstate, cwp */ \ - 0, 0, 0, 0, \ -/* flags, ctx, w_saved, new_signal, current_ds, */ \ - SPARC_FLAG_KTHREAD, 0, 0, 0, KERNEL_DS, \ +/* ksp, wstate, cwp, flags, ctx, */ \ + 0, 0, 0, SPARC_FLAG_KTHREAD, 0, \ +/* w_saved, new_signal, padding, current_ds, */ \ + 0, 0, 0, KERNEL_DS, \ /* kregs, utraps, */ \ 0, 0, \ /* reg_window */ \ { { { 0, }, { 0, } }, }, \ /* rwbuf_stkptrs */ \ - { 0, 0, 0, 0, 0, 0, 0, 0, }, \ -/* sig_address, sig_desc, sstk_info */ \ - 0, 0, { 0, 0, }, \ + { 0, 0, 0, 0, 0, 0, 0, }, \ +/* sig_address, sig_desc */ \ + 0, 0, \ +/* fpdepth, fpsaved, gsr, xfsr */ \ + 0, { 0 }, { 0 }, { 0 }, \ } #ifndef __ASSEMBLY__ @@ -109,7 +100,10 @@ struct thread_struct { /* Return saved PC of a blocked thread. */ extern __inline__ unsigned long thread_saved_pc(struct thread_struct *t) { - return t->kpc; + unsigned long *sp = (unsigned long *)(t->ksp + STACK_BIAS); + unsigned long *fp = (unsigned long *)(sp[14] + STACK_BIAS); + + return fp[15]; } /* On Uniprocessor, even in RMO processes see TSO semantics */ @@ -160,8 +154,6 @@ do { \ #define start_thread32(regs, pc, sp) \ do { \ - register unsigned int zero asm("g1"); \ -\ pc &= 0x00000000ffffffffUL; \ sp &= 0x00000000ffffffffUL; \ \ @@ -178,8 +170,8 @@ do { \ (*(current->tss.utraps))--; \ current->tss.utraps = NULL; \ } \ - zero = 0; \ __asm__ __volatile__( \ + "stxa %3, [%4] %5\n\t" \ "stx %%g0, [%0 + %2 + 0x00]\n\t" \ "stx %%g0, [%0 + %2 + 0x08]\n\t" \ "stx %%g0, [%0 + %2 + 0x10]\n\t" \ @@ -200,12 +192,15 @@ do { \ : \ : "r" (regs), "r" (sp - REGWIN32_SZ), \ "i" ((const unsigned long)(&((struct pt_regs *)0)->u_regs[0])), \ - "r" (zero)); \ + "r" (current->mm->pgd[0]), "r" (TSB_REG), "i" (ASI_DMMU)); \ } while(0) /* Free all resources held by a thread. */ #define release_thread(tsk) do { } while(0) +#define copy_segments(nr, tsk, mm) do { } while (0) +#define release_segments(mm) do { } while (0) + #ifdef __KERNEL__ /* Allocation and freeing of task_struct and kernel stack. */ #define alloc_task_struct() ((struct task_struct *)__get_free_pages(GFP_KERNEL, 1)) diff --git a/include/asm-sparc64/sbus.h b/include/asm-sparc64/sbus.h index 95aa09ede..ea2f85132 100644 --- a/include/asm-sparc64/sbus.h +++ b/include/asm-sparc64/sbus.h @@ -1,4 +1,4 @@ -/* $Id: sbus.h,v 1.6 1998/03/09 14:05:03 jj Exp $ +/* $Id: sbus.h,v 1.7 1998/05/22 14:33:40 jj Exp $ * sbus.h: Defines for the Sun SBus. * * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) @@ -54,7 +54,7 @@ struct linux_sbus_device { struct linux_prom_registers reg_addrs[PROMREG_MAX]; int num_registers, ranges_applied; - struct linux_prom_irqs irqs[PROMINTR_MAX]; + unsigned int irqs[4]; int num_irqs; unsigned long sbus_addr; /* Absolute base address for device. */ diff --git a/include/asm-sparc64/siginfo.h b/include/asm-sparc64/siginfo.h index cd0611f89..ff2534c66 100644 --- a/include/asm-sparc64/siginfo.h +++ b/include/asm-sparc64/siginfo.h @@ -51,6 +51,7 @@ typedef struct siginfo { /* SIGCHLD */ struct { pid_t _pid; /* which child */ + uid_t _uid; /* sender's uid */ int _status; /* exit code */ clock_t _utime; clock_t _stime; diff --git a/include/asm-sparc64/signal.h b/include/asm-sparc64/signal.h index 42382c42c..ba179564b 100644 --- a/include/asm-sparc64/signal.h +++ b/include/asm-sparc64/signal.h @@ -1,4 +1,4 @@ -/* $Id: signal.h,v 1.4 1997/12/11 15:16:06 jj Exp $ */ +/* $Id: signal.h,v 1.8 1998/07/29 16:32:39 jj Exp $ */ #ifndef _ASMSPARC64_SIGNAL_H #define _ASMSPARC64_SIGNAL_H @@ -75,6 +75,7 @@ #define SIGPROF 27 #define SIGWINCH 28 #define SIGLOST 29 +#define SIGPWR SIGLOST #define SIGUSR1 30 #define SIGUSR2 31 @@ -148,6 +149,7 @@ struct sigstack { */ #define SA_NOCLDSTOP SV_IGNCHILD #define SA_STACK SV_SSTACK +#define SA_ONSTACK SV_SSTACK #define SA_RESTART SV_INTR #define SA_ONESHOT SV_RESET #define SA_INTERRUPT 0x10 @@ -161,6 +163,15 @@ struct sigstack { #define SIG_UNBLOCK 0x02 /* for unblocking signals */ #define SIG_SETMASK 0x04 /* for setting the signal mask */ +/* + * sigaltstack controls + */ +#define SS_ONSTACK 1 +#define SS_DISABLE 2 + +#define MINSIGSTKSZ 4096 +#define SIGSTKSZ 16384 + #ifdef __KERNEL__ /* * These values of sa_flags are used only by the kernel as part of the @@ -233,6 +244,12 @@ typedef struct sigaltstack { __kernel_size_t ss_size; } stack_t; +typedef struct sigaltstack32 { + u32 ss_sp; + int ss_flags; + __kernel_size_t32 ss_size; +} stack_t32; + #endif /* !(__ASSEMBLY__) */ #endif /* !(_ASMSPARC64_SIGNAL_H) */ diff --git a/include/asm-sparc64/smp.h b/include/asm-sparc64/smp.h index 53121ff1c..1a07cd850 100644 --- a/include/asm-sparc64/smp.h +++ b/include/asm-sparc64/smp.h @@ -36,28 +36,18 @@ struct cpuinfo_sparc { unsigned long irq_count; unsigned int multiplier; unsigned int counter; - unsigned long last_tlbversion_seen; unsigned long pgcache_size; + unsigned long pgdcache_size; /* Dcache line 2 */ unsigned long *pgd_cache; - unsigned long *pmd_cache; unsigned long *pte_cache; unsigned long udelay_val; + unsigned long dummy; }; extern struct cpuinfo_sparc cpu_data[NR_CPUS]; -struct klock_info { - unsigned char kernel_flag; - unsigned char akp; -}; - -extern struct klock_info klock_info; - -#define KLOCK_HELD 0xff -#define KLOCK_CLEAR 0x00 - /* * Private routines/data */ @@ -95,18 +85,15 @@ extern __inline__ int hard_smp_processor_id(void) extern void smp_message_pass(int target, int msg, unsigned long data, int wait); +/* As idle task checks need_resched in a tight loop, it is not necessary to + wake it up. -jj */ +#define smp_send_reschedule(cpu) do {} while (0) + #endif /* !(__ASSEMBLY__) */ #define PROC_CHANGE_PENALTY 20 #else /* !(__SMP__) */ -#ifndef __ASSEMBLY__ -extern __inline__ int cpu_logical_map(int cpu) -{ - return cpu; -} -#endif -#endif /* !(__SMP__) */ #define NO_PROC_ID 0xFF diff --git a/include/asm-sparc64/smp_lock.h b/include/asm-sparc64/smp_lock.h deleted file mode 100644 index a01d9ec35..000000000 --- a/include/asm-sparc64/smp_lock.h +++ /dev/null @@ -1,87 +0,0 @@ -/* smp_lock.h: Locking and unlocking the kernel on the 64-bit Sparc. - * - * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) - */ - -#ifndef __SPARC64_SMPLOCK_H -#define __SPARC64_SMPLOCK_H - -#include <asm/smp.h> -#include <asm/bitops.h> -#include <asm/pgtable.h> - -#ifndef __SMP__ - -#define lock_kernel() do { } while(0) -#define unlock_kernel() do { } while(0) -#define release_kernel_lock(task, cpu, depth) ((depth) = 1) -#define reacquire_kernel_lock(task, cpu, depth) do { } while(0) - -#else - -#include <asm/hardirq.h> - -/* Release global kernel lock and global interrupt lock */ -#define release_kernel_lock(task, cpu, depth) \ -do { \ - if((depth = (task)->lock_depth) != 0) { \ - __cli(); \ - (task)->lock_depth = 0; \ - klock_info.akp = NO_PROC_ID; \ - membar("#LoadStore | #StoreStore"); \ - klock_info.kernel_flag = 0; \ - } \ - release_irqlock(cpu); \ - __sti(); \ -} while(0) - -/* Do not fuck with this without consulting arch/sparc64/lib/locks.S first! */ -#define reacquire_kernel_lock(task, cpu, depth) \ -do { \ - if(depth) { \ - register struct klock_info *klip asm("g1"); \ - klip = &klock_info; \ - __asm__ __volatile__("mov %%o7, %%g5\n\t" \ - "call ___lock_reacquire_kernel\n\t" \ - " mov %1, %%g2" \ - : /* No outputs. */ \ - : "r" (klip), "r" (depth) \ - : "g2", "g3", "g5", "memory", "cc"); \ - } \ -} while(0) - -/* The following acquire and release the master kernel global lock, - * the idea is that the usage of this mechanmism becomes less and less - * as time goes on, to the point where they are no longer needed at all - * and can thus disappear. - */ - -/* Do not fuck with this without consulting arch/sparc64/lib/locks.S first! */ -extern __inline__ void lock_kernel(void) -{ - register struct klock_info *klip asm("g1"); - klip = &klock_info; - __asm__ __volatile__(" - mov %%o7, %%g5 - call ___lock_kernel - lduw [%%g6 + %0], %%g2 -" : : "i" (AOFF_task_lock_depth), "r" (klip) - : "g2", "g3", "g5", "memory", "cc"); -} - -/* Release kernel global lock. */ -extern __inline__ void unlock_kernel(void) -{ - register struct klock_info *klip asm("g1"); - klip = &klock_info; - __asm__ __volatile__(" - mov %%o7, %%g5 - call ___unlock_kernel - lduw [%%g6 + %0], %%g2 -" : : "i" (AOFF_task_lock_depth), "r" (klip) - : "g2", "g3", "g5", "memory", "cc"); -} - -#endif /* (__SMP__) */ - -#endif /* !(__SPARC64_SMPLOCK_H) */ diff --git a/include/asm-sparc64/smplock.h b/include/asm-sparc64/smplock.h new file mode 100644 index 000000000..e62326a10 --- /dev/null +++ b/include/asm-sparc64/smplock.h @@ -0,0 +1,49 @@ +/* + * <asm/smplock.h> + * + * Default SMP lock implementation + */ +#include <linux/interrupt.h> +#include <asm/spinlock.h> + +extern spinlock_t kernel_flag; + +/* + * Release global kernel lock and global interrupt lock + */ +#define release_kernel_lock(task, cpu) \ +do { \ + if (task->lock_depth >= 0) \ + spin_unlock(&kernel_flag); \ + release_irqlock(cpu); \ + __sti(); \ +} while (0) + +/* + * Re-acquire the kernel lock + */ +#define reacquire_kernel_lock(task) \ +do { \ + if (task->lock_depth >= 0) \ + spin_lock(&kernel_flag); \ +} while (0) + + +/* + * Getting the big kernel lock. + * + * This cannot happen asynchronously, + * so we only need to worry about other + * CPU's. + */ +extern __inline__ void lock_kernel(void) +{ + if (!++current->lock_depth) + spin_lock(&kernel_flag); +} + +extern __inline__ void unlock_kernel(void) +{ + if (--current->lock_depth < 0) + spin_unlock(&kernel_flag); +} diff --git a/include/asm-sparc64/socket.h b/include/asm-sparc64/socket.h index 3c110baeb..0f25b82c1 100644 --- a/include/asm-sparc64/socket.h +++ b/include/asm-sparc64/socket.h @@ -1,4 +1,4 @@ -/* $Id: socket.h,v 1.4 1997/10/19 00:19:23 davem Exp $ */ +/* $Id: socket.h,v 1.5 1998/07/22 22:06:49 davem Exp $ */ #ifndef _ASM_SOCKET_H #define _ASM_SOCKET_H @@ -37,6 +37,9 @@ #define SO_BINDTODEVICE 0x000d +#define SO_ATTACH_FILTER 0x001a +#define SO_DETACH_FILTER 0x001b + /* Security levels - as per NRL IPv6 - don't actually do anything */ #define SO_SECURITY_AUTHENTICATION 0x5001 #define SO_SECURITY_ENCRYPTION_TRANSPORT 0x5002 diff --git a/include/asm-sparc64/softirq.h b/include/asm-sparc64/softirq.h index 1357489b4..0e1a6b589 100644 --- a/include/asm-sparc64/softirq.h +++ b/include/asm-sparc64/softirq.h @@ -23,6 +23,7 @@ extern int __sparc64_bh_counter; #define softirq_trylock(cpu) (__sparc64_bh_counter ? 0 : (__sparc64_bh_counter=1)) #define softirq_endlock(cpu) (__sparc64_bh_counter = 0) #define clear_active_bhs(x) (bh_active &= ~(x)) +#define synchronize_bh() do { } while (0) /* XXX implement SMP version -DaveM */ #define init_bh(nr, routine) \ do { int ent = nr; \ diff --git a/include/asm-sparc64/spinlock.h b/include/asm-sparc64/spinlock.h index 65880b033..4e2dd6b8c 100644 --- a/include/asm-sparc64/spinlock.h +++ b/include/asm-sparc64/spinlock.h @@ -10,8 +10,13 @@ #ifndef __SMP__ -typedef struct { } spinlock_t; -#define SPIN_LOCK_UNLOCKED { } +#if (__GNUC__ > 2) || (__GNUC_MINOR__ >= 8) + typedef struct { } spinlock_t; + #define SPIN_LOCK_UNLOCKED { } +#else + typedef unsigned char spinlock_t; + #define SPIN_LOCK_UNLOCKED 0 +#endif #define spin_lock_init(lock) do { } while(0) #define spin_lock(lock) do { } while(0) diff --git a/include/asm-sparc64/spitfire.h b/include/asm-sparc64/spitfire.h index 76232c227..04667b185 100644 --- a/include/asm-sparc64/spitfire.h +++ b/include/asm-sparc64/spitfire.h @@ -1,4 +1,4 @@ -/* $Id: spitfire.h,v 1.8 1997/05/18 04:16:56 davem Exp $ +/* $Id: spitfire.h,v 1.9 1998/04/28 08:23:33 davem Exp $ * spitfire.h: SpitFire/BlackBird/Cheetah inline MMU operations. * * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) @@ -85,7 +85,7 @@ extern __inline__ void spitfire_set_primary_context(unsigned long ctx) { __asm__ __volatile__("stxa %0, [%1] %2" : /* No outputs */ - : "r" (ctx & 0x1fff), + : "r" (ctx & 0x3ff), "r" (PRIMARY_CONTEXT), "i" (ASI_DMMU)); membar("#Sync"); } @@ -104,7 +104,7 @@ extern __inline__ void spitfire_set_secondary_context(unsigned long ctx) { __asm__ __volatile__("stxa %0, [%1] %2" : /* No outputs */ - : "r" (ctx & 0x1fff), + : "r" (ctx & 0x3ff), "r" (SECONDARY_CONTEXT), "i" (ASI_DMMU)); membar("#Sync"); } diff --git a/include/asm-sparc64/stat.h b/include/asm-sparc64/stat.h index 05853d3b5..f726bd5a0 100644 --- a/include/asm-sparc64/stat.h +++ b/include/asm-sparc64/stat.h @@ -1,4 +1,4 @@ -/* $Id: stat.h,v 1.4 1998/02/06 12:52:14 jj Exp $ */ +/* $Id: stat.h,v 1.5 1998/07/26 05:24:41 davem Exp $ */ #ifndef _SPARC64_STAT_H #define _SPARC64_STAT_H @@ -42,54 +42,4 @@ struct stat { unsigned long __unused4[2]; }; -typedef __u64 __new_dev_t; - -struct stat64 { - __new_dev_t st_dev; - __u64 st_ino; - __u32 st_mode; - __u32 st_nlink; - __s32 st_uid; - __s32 st_gid; - __new_dev_t st_rdev; - __s64 st_size; - struct timespec st_atim; - struct timespec st_mtim; - struct timespec st_ctim; - int st_blksize; - long st_blocks; - char st_fstype[16]; -}; - -struct stat64_32 { - __new_dev_t st_dev; - __u64 st_ino; - __u32 st_mode; - __u32 st_nlink; - __s32 st_uid; - __s32 st_gid; - __new_dev_t st_rdev; - __s64 st_size; - __u64 st_blocks; - __s32 st_atime; - __u32 __unused1; - __s32 st_mtime; - __u32 __unused2; - __s32 st_ctime; - __u32 __unused3; - __u32 st_blksize; - __u32 __unused4; -}; - -#define __XSTAT_VER_1 1 -#define __XSTAT_VER_2 2 -#define __XSTAT_VER_MASK 0xff - -#define __XSTAT_VER_XSTAT 0x000 -#define __XSTAT_VER_LXSTAT 0x100 -#define __XSTAT_VER_FXSTAT 0x200 -#define __XSTAT_VER_TYPEMASK 0xff00 - -#define __XMKNOD_VER_1 1 - #endif diff --git a/include/asm-sparc64/string.h b/include/asm-sparc64/string.h index 545e1285d..b5293acd9 100644 --- a/include/asm-sparc64/string.h +++ b/include/asm-sparc64/string.h @@ -1,4 +1,4 @@ -/* $Id: string.h,v 1.8 1997/11/19 07:57:50 jj Exp $ +/* $Id: string.h,v 1.11 1998/06/12 14:54:35 jj Exp $ * string.h: External definitions for optimized assembly string * routines for the Linux Kernel. * @@ -67,8 +67,8 @@ extern inline void *__nonconstant_memcpy(void *to, const void *from, __kernel_si extern inline void *__constant_c_and_count_memset(void *s, char c, __kernel_size_t count) { - extern void *__bzero_1page(void *); extern __kernel_size_t __bzero(void *, __kernel_size_t); + extern void *__bzero_1page(void *); if(!c) { if (count == 8192) diff --git a/include/asm-sparc64/svr4.h b/include/asm-sparc64/svr4.h index 2e624a94b..fbf94c2e2 100644 --- a/include/asm-sparc64/svr4.h +++ b/include/asm-sparc64/svr4.h @@ -81,7 +81,7 @@ typedef struct { /* flags for stack_t.flags */ enum svr4_stack_flags { - SS_ONSTACK, + SVR4_SS_ONSTACK, SVR4_SS_DISABLE, }; diff --git a/include/asm-sparc64/system.h b/include/asm-sparc64/system.h index 5bec88028..55072c93b 100644 --- a/include/asm-sparc64/system.h +++ b/include/asm-sparc64/system.h @@ -1,10 +1,11 @@ -/* $Id: system.h,v 1.38 1998/01/30 11:00:11 jj Exp $ */ +/* $Id: system.h,v 1.42 1998/07/29 01:32:51 davem Exp $ */ #ifndef __SPARC64_SYSTEM_H #define __SPARC64_SYSTEM_H #include <asm/ptrace.h> #include <asm/processor.h> #include <asm/asm_offsets.h> +#include <asm/visasm.h> #ifndef __ASSEMBLY__ /* @@ -28,8 +29,6 @@ enum sparc_cpu { #define ARCH_SUN4 0 extern unsigned long empty_bad_page; -extern unsigned long empty_bad_pmd_table; -extern unsigned long empty_bad_pte_table; extern unsigned long empty_zero_page; #endif @@ -43,10 +42,10 @@ extern unsigned long empty_zero_page; __asm__ __volatile__("wrpr 0, %%pil" : : : "memory") #define getipl() \ -({ int retval; __asm__ __volatile__("rdpr %%pil, %0" : "=r" (retval)); retval; }) +({ unsigned long retval; __asm__ __volatile__("rdpr %%pil, %0" : "=r" (retval)); retval; }) #define swap_pil(__new_pil) \ -({ int retval; \ +({ unsigned long retval; \ __asm__ __volatile__("rdpr %%pil, %0\n\t" \ "wrpr %1, %%pil" \ : "=r" (retval) \ @@ -56,7 +55,7 @@ extern unsigned long empty_zero_page; }) #define read_pil_and_cli() \ -({ int retval; \ +({ unsigned long retval; \ __asm__ __volatile__("rdpr %%pil, %0\n\t" \ "wrpr 15, %%pil" \ : "=r" (retval) \ @@ -126,12 +125,10 @@ extern __inline__ void flushw_user(void) #define flush_user_windows flushw_user /* See what happens when you design the chip correctly? - * NOTE NOTE NOTE this is extremely non-trivial what I - * am doing here. GCC needs only one register to stuff - * things into ('next' in particular) So I "claim" that - * I do not clobber it, when in fact I do. Please, - * when modifying this code inspect output of sched.s very - * carefully to make sure things still work. -DaveM + * + * XXX What we are doing here assumes a lot about gcc reload + * XXX internals, it heavily risks compiler aborts due to + * XXX forbidden registers being spilled. Rewrite me... -DaveM * * SMP NOTE: At first glance it looks like there is a tiny * race window here at the end. The possible problem @@ -144,48 +141,48 @@ extern __inline__ void flushw_user(void) * not reference %g6. */ #define switch_to(prev, next) \ -do { __label__ switch_continue; \ - register unsigned long task_pc asm("o7"); \ - (prev)->tss.kregs->tstate &= ~TSTATE_PEF; \ - task_pc = ((unsigned long) &&switch_continue) - 0x8; \ +do { save_and_clear_fpu(); \ (next)->mm->cpu_vm_mask |= (1UL << smp_processor_id()); \ __asm__ __volatile__( \ "rdpr %%pstate, %%g2\n\t" \ "wrpr %%g2, 0x3, %%pstate\n\t" \ "flushw\n\t" \ + "stx %%l0, [%%sp + 2047 + 0x60]\n\t" \ + "stx %%l1, [%%sp + 2047 + 0x68]\n\t" \ "stx %%i6, [%%sp + 2047 + 0x70]\n\t" \ "stx %%i7, [%%sp + 2047 + 0x78]\n\t" \ "rdpr %%wstate, %%o5\n\t" \ - "stx %%o6, [%%g6 + %3]\n\t" \ - "stw %%o7, [%%g6 + %4]\n\t" \ - "sth %%o5, [%%g6 + %2]\n\t" \ + "stx %%o6, [%%g6 + %2]\n\t" \ + "sth %%o5, [%%g6 + %1]\n\t" \ "rdpr %%cwp, %%o5\n\t" \ - "sth %%o5, [%%g6 + %5]\n\t" \ - "membar #Sync\n\t" \ + "sth %%o5, [%%g6 + %4]\n\t" \ "mov %0, %%g6\n\t" \ - "lduh [%0 + %5], %%g1\n\t" \ + "lduh [%0 + %4], %%g1\n\t" \ "wrpr %%g1, %%cwp\n\t" \ - "ldx [%%g6 + %3], %%o6\n\t" \ - "lduw [%%g6 + %4], %%o7\n\t" \ - "lduh [%%g6 + %2], %%o5\n\t" \ - "mov %%g6, %0\n\t" \ + "ldx [%%g6 + %2], %%o6\n\t" \ + "lduh [%%g6 + %1], %%o5\n\t" \ + "lduh [%%g6 + %3], %%o7\n\t" \ + "mov %%g6, %%l2\n\t" \ "wrpr %%o5, 0x0, %%wstate\n\t" \ + "ldx [%%sp + 2047 + 0x60], %%l0\n\t" \ + "ldx [%%sp + 2047 + 0x68], %%l1\n\t" \ "ldx [%%sp + 2047 + 0x70], %%i6\n\t" \ "ldx [%%sp + 2047 + 0x78], %%i7\n\t" \ "wrpr %%g0, 0x96, %%pstate\n\t" \ - "jmpl %%o7 + 0x8, %%g0\n\t" \ - " mov %0, %%g6\n\t" \ - : /* No outputs */ \ - : "r" (next), "r" (task_pc), \ + "andcc %%o7, 0x100, %%g0\n\t" \ + "bne,pn %%icc, ret_from_syscall\n\t" \ + " mov %%l2, %%g6\n\t" \ + : \ + : "r" (next), \ "i" ((const unsigned long)(&((struct task_struct *)0)->tss.wstate)), \ "i" ((const unsigned long)(&((struct task_struct *)0)->tss.ksp)), \ - "i" ((const unsigned long)(&((struct task_struct *)0)->tss.kpc)), \ + "i" ((const unsigned long)(&((struct task_struct *)0)->tss.flags)), \ "i" ((const unsigned long)(&((struct task_struct *)0)->tss.cwp)) \ : "cc", "g1", "g2", "g3", "g5", "g7", \ - "l1", "l2", "l3", "l4", "l5", "l6", "l7", \ + "l2", "l3", "l4", "l5", "l6", "l7", \ "i0", "i1", "i2", "i3", "i4", "i5", \ - "o0", "o1", "o2", "o3", "o4", "o5"); \ -switch_continue: } while(0) + "o0", "o1", "o2", "o3", "o4", "o5", "o7"); \ +} while(0) extern __inline__ unsigned long xchg32(__volatile__ unsigned int *m, unsigned int val) { diff --git a/include/asm-sparc64/termios.h b/include/asm-sparc64/termios.h index 622158d24..8a972984b 100644 --- a/include/asm-sparc64/termios.h +++ b/include/asm-sparc64/termios.h @@ -1,4 +1,4 @@ -/* $Id: termios.h,v 1.4 1997/03/14 21:05:26 jj Exp $ */ +/* $Id: termios.h,v 1.5 1998/04/12 06:27:22 davem Exp $ */ #ifndef _SPARC64_TERMIOS_H #define _SPARC64_TERMIOS_H diff --git a/include/asm-sparc64/timex.h b/include/asm-sparc64/timex.h new file mode 100644 index 000000000..80210c259 --- /dev/null +++ b/include/asm-sparc64/timex.h @@ -0,0 +1,15 @@ +/* + * linux/include/asm-sparc64/timex.h + * + * sparc64 architecture timex specifications + */ +#ifndef _ASMsparc64_TIMEX_H +#define _ASMsparc64_TIMEX_H + +#define CLOCK_TICK_RATE 1193180 /* Underlying HZ */ +#define CLOCK_TICK_FACTOR 20 /* Factor of both 1000000 and CLOCK_TICK_RATE */ +#define FINETUNE ((((((long)LATCH * HZ - CLOCK_TICK_RATE) << SHIFT_HZ) * \ + (1000000/CLOCK_TICK_FACTOR) / (CLOCK_TICK_RATE/CLOCK_TICK_FACTOR)) \ + << (SHIFT_SCALE-SHIFT_HZ)) / HZ) + +#endif diff --git a/include/asm-sparc64/ttable.h b/include/asm-sparc64/ttable.h index 82e360042..9d2434618 100644 --- a/include/asm-sparc64/ttable.h +++ b/include/asm-sparc64/ttable.h @@ -1,4 +1,4 @@ -/* $Id: ttable.h,v 1.6 1998/03/15 17:23:54 ecd Exp $ */ +/* $Id: ttable.h,v 1.8 1998/06/12 14:54:32 jj Exp $ */ #ifndef _SPARC64_TTABLE_H #define _SPARC64_TTABLE_H @@ -66,7 +66,7 @@ #define SYSCALL_TRAP(routine, systbl) \ sethi %hi(109f), %g7; \ - ba,pt %xcc, etrap; \ + ba,pt %xcc, scetrap; \ 109: or %g7, %lo(109b), %g7; \ call routine; \ sethi %hi(systbl), %l7; \ @@ -133,6 +133,16 @@ call routine; \ add %sp, STACK_BIAS + REGWIN_SZ, %o1; \ ba,a,pt %xcc, rtrap_clr_l6; + +#define TICK_SMP_IRQ \ + rdpr %pil, %g2; \ + wrpr %g0, 15, %pil; \ + sethi %hi(109f), %g7; \ + b,pt %xcc, etrap_irq; \ +109: or %g7, %lo(109b), %g7; \ + call smp_percpu_timer_interrupt; \ + add %sp, STACK_BIAS + REGWIN_SZ, %o0; \ + ba,a,pt %xcc, rtrap_clr_l6; #define TRAP_IVEC TRAP_NOSAVE(do_ivec) diff --git a/include/asm-sparc64/uaccess.h b/include/asm-sparc64/uaccess.h index e2d59cf23..ec80bb5dc 100644 --- a/include/asm-sparc64/uaccess.h +++ b/include/asm-sparc64/uaccess.h @@ -1,4 +1,4 @@ -/* $Id: uaccess.h,v 1.24 1997/12/15 15:05:14 jj Exp $ */ +/* $Id: uaccess.h,v 1.25 1998/04/28 08:23:34 davem Exp $ */ #ifndef _ASM_UACCESS_H #define _ASM_UACCESS_H @@ -52,7 +52,7 @@ do { \ flushw_user (); \ current->tss.ctx = 0; \ } else { \ - current->tss.ctx = (current->mm->context & 0x1fff); \ + current->tss.ctx = (current->mm->context & 0x3ff); \ } \ spitfire_set_secondary_context(current->tss.ctx); \ __asm__ __volatile__("flush %g6"); \ diff --git a/include/asm-sparc64/unistd.h b/include/asm-sparc64/unistd.h index ca749ffd9..960d3a01b 100644 --- a/include/asm-sparc64/unistd.h +++ b/include/asm-sparc64/unistd.h @@ -1,4 +1,4 @@ -/* $Id: unistd.h,v 1.17 1998/03/29 12:57:54 ecd Exp $ */ +/* $Id: unistd.h,v 1.20 1998/07/28 13:08:40 jj Exp $ */ #ifndef _SPARC64_UNISTD_H #define _SPARC64_UNISTD_H @@ -29,22 +29,22 @@ #define __NR_unlink 10 /* Common */ #define __NR_execv 11 /* SunOS Specific */ #define __NR_chdir 12 /* Common */ -#define __NR_xstat 13 /* Linux Specific */ +/* #define __NR_ni_syscall 13 ENOSYS under SunOS */ #define __NR_mknod 14 /* Common */ #define __NR_chmod 15 /* Common */ #define __NR_chown 16 /* Common */ #define __NR_brk 17 /* Common */ -#define __NR_xmknod 18 /* Linux Specific */ +/* #define __NR_ni_syscall 18 ENOSYS under SunOS */ #define __NR_lseek 19 /* Common */ #define __NR_getpid 20 /* Common */ -/* #define __NR_ni_syscall 21 ENOSYS under SunOS */ -/* #define __NR_ni_syscall 22 ENOSYS under SunOS */ +#define __NR_capget 21 /* Linux Specific */ +#define __NR_capset 22 /* Linux Specific */ #define __NR_setuid 23 /* Implemented via setreuid in SunOS */ #define __NR_getuid 24 /* Common */ /* #define __NR_time alias 25 ENOSYS under SunOS */ #define __NR_ptrace 26 /* Common */ #define __NR_alarm 27 /* Implemented via setitimer in SunOS */ -/* #define __NR_ni_syscall 28 ENOSYS under SunOS */ +#define __NR_sigaltstack 28 /* Common */ #define __NR_pause 29 /* Is sigblock(0)->sigpause() in SunOS */ #define __NR_utime 30 /* Implemented via utimes() under SunOS */ #define __NR_stty 31 /* Implemented via ioctl() under SunOS */ @@ -55,7 +55,7 @@ #define __NR_sync 36 /* Common */ #define __NR_kill 37 /* Common */ #define __NR_stat 38 /* Common */ -/* #define __NR_ni_syscall 39 ENOSYS under SunOS */ +#define __NR_sendfile 39 /* Linux Specific */ #define __NR_lstat 40 /* Common */ #define __NR_dup 41 /* Common */ #define __NR_pipe 42 /* Common */ @@ -135,7 +135,7 @@ #define __NR_gettimeofday 116 /* Common */ #define __NR_getrusage 117 /* Common */ #define __NR_getsockopt 118 /* Common */ -/* #define __NR_ni_syscall 119 ENOSYS under SunOS */ +#define __NR_getcwd 119 /* Linux Specific */ #define __NR_readv 120 /* Common */ #define __NR_writev 121 /* Common */ #define __NR_settimeofday 122 /* Common */ diff --git a/include/asm-sparc64/vaddrs.h b/include/asm-sparc64/vaddrs.h index b88085668..04a265680 100644 --- a/include/asm-sparc64/vaddrs.h +++ b/include/asm-sparc64/vaddrs.h @@ -1,4 +1,4 @@ -/* $Id: vaddrs.h,v 1.8 1997/06/27 14:55:13 jj Exp $ */ +/* $Id: vaddrs.h,v 1.10 1998/05/14 13:36:01 jj Exp $ */ #ifndef _SPARC64_VADDRS_H #define _SPARC64_VADDRS_H @@ -7,19 +7,13 @@ * For instance the timer register virtual address * is defined here. * - * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) + * Copyright (C) 1995,1998 David S. Miller (davem@caip.rutgers.edu) */ -/* I can see only one reason why we should have statically defined - * mappings for devices and is the speedup improvements of not loading - * a pointer and then the value in the assembly code - */ -#define IOBASE_VADDR 0x0000006000000000ULL /* Base for mapping pages */ -#define IOBASE_LEN 0x0000001000000000ULL /* Length of the IO area */ -#define IOBASE_END 0x0000007000000000ULL -#define DVMA_VADDR 0x0000007000000000ULL /* Base area of the DVMA on suns */ -#define DVMA_LEN 0x0000001000000000ULL /* Size of the DVMA address space */ -#define DVMA_END 0x0000008000000000ULL +/* Everything here must be in the first kernel PGD. */ +#define DVMA_VADDR 0x0000000100000000ULL /* Base area of the DVMA on suns */ +#define DVMA_LEN 0x0000000040000000ULL /* Size of the DVMA address space */ +#define DVMA_END 0x0000000140000000ULL #define MODULES_VADDR 0x0000000001000000ULL /* Where to map modules */ #define MODULES_LEN 0x000000007f000000ULL #define MODULES_END 0x0000000080000000ULL diff --git a/include/asm-sparc64/vga.h b/include/asm-sparc64/vga.h new file mode 100644 index 000000000..14ae757a4 --- /dev/null +++ b/include/asm-sparc64/vga.h @@ -0,0 +1,30 @@ +/* + * Access to VGA videoram + * + * (c) 1998 Martin Mares <mj@ucw.cz> + */ + +#ifndef _LINUX_ASM_VGA_H_ +#define _LINUX_ASM_VGA_H_ + +#define VT_BUF_HAVE_RW + +static inline void scr_writew(u16 val, u16 *addr) +{ + if ((long) addr < 0) + *addr = val; + else + writew(val, (unsigned long) addr); +} + +static inline u16 scr_readw(u16 *addr) +{ + if ((long) addr < 0) + return *addr; + else + return readw((unsigned long) addr); +} + +#define VGA_MAP_MEM(x) (x) + +#endif diff --git a/include/asm-sparc64/visasm.h b/include/asm-sparc64/visasm.h new file mode 100644 index 000000000..e1de6a384 --- /dev/null +++ b/include/asm-sparc64/visasm.h @@ -0,0 +1,62 @@ +/* $Id: visasm.h,v 1.2 1998/06/19 12:14:47 jj Exp $ */ +#ifndef _SPARC64_VISASM_H +#define _SPARC64_VISASM_H + +/* visasm.h: FPU saving macros for VIS routines + * + * Copyright (C) 1998 Jakub Jelinek (jj@ultra.linux.cz) + */ + +#include <asm/pstate.h> +#include <asm/ptrace.h> + +#define AOFF_task_fpregs ((AOFF_task_sigmask_lock + 285)&~255) + +/* Clobbers %o5, %g1, %g2, %g3, %g7, %icc, %xcc */ + +#define VISEntry \ + rd %fprs, %o5; \ + andcc %o5, (FPRS_FEF|FPRS_DU), %g0; \ + be,pt %icc, 297f; \ + sethi %hi(297f), %g7; \ + ba,pt %xcc, VISenter; \ + or %g7, %lo(297f), %g7; \ +297: wr %g0, FPRS_FEF, %fprs; \ + +#define VISExit \ + wr %g0, 0, %fprs; + +/* Clobbers %o5, %g1, %g2, %g3, %g7, %icc, %xcc. + * Must preserve %o5 between VISEntryHalf and VISExitHalf */ + +#define VISEntryHalf \ + rd %fprs, %o5; \ + andcc %o5, FPRS_FEF, %g0; \ + be,pt %icc, 297f; \ + sethi %hi(298f), %g7; \ + ba,pt %xcc, VISenterhalf; \ + or %g7, %lo(298f), %g7; \ + clr %o5; \ +297: wr %o5, FPRS_FEF, %fprs; \ +298: + +#define VISExitHalf \ + wr %o5, 0, %fprs; + +#ifndef __ASSEMBLY__ +extern __inline__ void save_and_clear_fpu(void) { + __asm__ __volatile__ (" + rd %%fprs, %%o5 + andcc %%o5, %0, %%g0 + be,pt %%icc, 299f + sethi %%hi(298f), %%g7 + ba VISenter ! Note. This cannot be bp, as it may be too far from VISenter. + or %%g7, %%lo(298f), %%g7 + 298: wr %%g0, 0, %%fprs + 299: + " : : "i" (FPRS_FEF|FPRS_DU) : + "o5", "g1", "g2", "g3", "g7", "cc"); +} +#endif + +#endif /* _SPARC64_ASI_H */ diff --git a/include/asm-sparc64/xstat.h b/include/asm-sparc64/xstat.h deleted file mode 100644 index f73a1b967..000000000 --- a/include/asm-sparc64/xstat.h +++ /dev/null @@ -1,58 +0,0 @@ -/* $Id: xstat.h,v 1.1 1998/02/06 12:52:18 jj Exp $ - * xstat.h: sys_xstat/xmknod architecture dependent stuff. - * - * Copyright (C) 1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) - */ - -extern __inline__ int cp_xstat32(struct inode *inode, struct stat64_32 *s, unsigned long blocks, int blksize) -{ - struct stat64_32 tmp; - - memset (&tmp, 0, sizeof(tmp)); - tmp.st_dev = (((__u64)MAJOR(inode->i_dev)) << 32) | MINOR(inode->i_dev); - tmp.st_ino = inode->i_ino; - tmp.st_mode = inode->i_mode; - tmp.st_nlink = inode->i_nlink; - tmp.st_uid = inode->i_uid; - tmp.st_gid = inode->i_gid; - tmp.st_rdev = (((__u64)MAJOR(inode->i_rdev)) << 32) | MINOR(inode->i_rdev); - tmp.st_size = inode->i_size; - tmp.st_blocks = blocks; - tmp.st_atime = inode->i_atime; - tmp.st_mtime = inode->i_mtime; - tmp.st_ctime = inode->i_ctime; - tmp.st_blksize = blksize; - return copy_to_user(s,&tmp,sizeof(tmp)); -} - -extern __inline__ int cp_xstat(struct inode *inode, struct stat64 *s, unsigned long blocks, int blksize) -{ - struct stat64 tmp; - if (current->tss.flags & SPARC_FLAG_32BIT) - return cp_xstat32(inode, (struct stat64_32 *)s, blocks, blksize); - memset (&tmp, 0, sizeof(tmp)); - tmp.st_dev = (((__u64)MAJOR(inode->i_dev)) << 32) | MINOR(inode->i_dev); - tmp.st_ino = inode->i_ino; - tmp.st_mode = inode->i_mode; - tmp.st_nlink = inode->i_nlink; - tmp.st_uid = inode->i_uid; - tmp.st_gid = inode->i_gid; - tmp.st_rdev = (((__u64)MAJOR(inode->i_rdev)) << 32) | MINOR(inode->i_rdev); - tmp.st_size = inode->i_size; - tmp.st_atim.tv_sec = inode->i_atime; - tmp.st_mtim.tv_sec = inode->i_mtime; - tmp.st_ctim.tv_sec = inode->i_ctime; - tmp.st_blksize = blksize; - tmp.st_blocks = blocks; - /* Should I check if all fs names are < 16? All in the kernel tree are */ - if (inode->i_sb) - strcpy(tmp.st_fstype, inode->i_sb->s_type->name); - return copy_to_user(s,&tmp,sizeof(tmp)); -} - -extern __inline__ int get_user_new_dev_t(kdev_t *kdev, __new_dev_t *udev) { - __new_dev_t ndev; - if (copy_from_user (&ndev, udev, sizeof(__new_dev_t))) return -EFAULT; - *kdev = MKDEV((ndev >> 32), (__u32)ndev); - return 0; -} diff --git a/include/linux/adfs_fs.h b/include/linux/adfs_fs.h index 453bb9258..fe4e79e4b 100644 --- a/include/linux/adfs_fs.h +++ b/include/linux/adfs_fs.h @@ -111,30 +111,22 @@ union adfs_dirtail { }; #ifdef __KERNEL__ - - /* * Calculate the boot block checksum on an ADFS drive. Note that this will * appear to be correct if the sector contains all zeros, so also check that * the disk size is non-zero!!! */ - extern inline int adfs_checkbblk(unsigned char *ptr) { - int i = 511; - - int result = 0; + unsigned int result = 0; + unsigned char *p = ptr + 511; do { - result = (result & 0xff) + (result >> 8); - result = result + ptr[i]; - i--; - } - while (i != 0); - - result &= 0xff; - return result != ptr[511]; - return 0; + result = (result & 0xff) + (result >> 8); + result = result + *--p; + } while (p != ptr); + + return (result & 0xff) != ptr[511]; } /* dir.c */ diff --git a/include/linux/affs_fs.h b/include/linux/affs_fs.h index 79e3c3639..6361a82a1 100644 --- a/include/linux/affs_fs.h +++ b/include/linux/affs_fs.h @@ -93,7 +93,8 @@ extern int init_affs_fs(void); /* file.c */ -extern void affs_truncate(struct inode *); +void affs_free_prealloc(struct inode *inode); +extern void affs_truncate(struct inode *); /* dir.c */ diff --git a/include/asm-m68k/amifd.h b/include/linux/amifd.h index ea21e69fd..491bdd86a 100644 --- a/include/asm-m68k/amifd.h +++ b/include/linux/amifd.h @@ -1,5 +1,5 @@ -#ifndef _ASM_M68K_AMIFD_H -#define _ASM_M68K_AMIFD_H +#ifndef _AMIFD_H +#define _AMIFD_H /* Definitions for the Amiga floppy driver */ diff --git a/include/asm-m68k/amifdreg.h b/include/linux/amifdreg.h index 76188bf48..76188bf48 100644 --- a/include/asm-m68k/amifdreg.h +++ b/include/linux/amifdreg.h diff --git a/include/linux/arcdevice.h b/include/linux/arcdevice.h index dc427588b..054c59f15 100644 --- a/include/linux/arcdevice.h +++ b/include/linux/arcdevice.h @@ -113,8 +113,9 @@ extern int arcnet_debug; /* macros to simplify debug checking */ #define BUGLVL(x) if ((ARCNET_DEBUG_MAX)&arcnet_debug&(x)) -#define BUGMSG2(x,msg,args...) BUGLVL(x) printk(msg, ## args) -#define BUGMSG(x,msg,args...) BUGMSG2(x,"%s%6s: " msg, \ +#define BUGMSG2(x,msg,args...) do { BUGLVL(x) printk(msg, ## args); } while (0) +#define BUGMSG(x,msg,args...) \ + BUGMSG2(x,"%s%6s: " msg, \ x==D_NORMAL ? KERN_WARNING : \ x<=D_INIT_REASONS ? KERN_INFO : KERN_DEBUG , \ dev->name , ## args) diff --git a/include/linux/atalk.h b/include/linux/atalk.h index 4981ed2eb..5641129d7 100644 --- a/include/linux/atalk.h +++ b/include/linux/atalk.h @@ -1,5 +1,5 @@ /* - * Appletalk networking structures + * AppleTalk networking structures * * The following are directly referenced from the University Of Michigan * netatalk for compatibility reasons. @@ -54,7 +54,7 @@ struct atalk_iface { struct device *dev; struct at_addr address; /* Our address */ - int status; /* What are we doing ?? */ + int status; /* What are we doing? */ #define ATIF_PROBE 1 /* Probing for an address */ #define ATIF_PROBE_FAIL 2 /* Probe collided */ struct netrange nets; /* Associated direct netrange */ @@ -93,6 +93,20 @@ struct ddpehdr }; /* + * Don't drop the struct into the struct above. You'll get some + * surprise padding. + */ + +struct ddpebits +{ +#ifdef __LITTLE_ENDIAN_BITFIELD + __u16 deh_len:10, deh_hops:4, deh_pad:2; +#else + __u16 deh_pad:2, deh_hops:4, deh_len:10; +#endif +}; + +/* * Short form header */ @@ -108,7 +122,7 @@ struct ddpshdr /* And netatalk apps expect to stick the type in themselves */ }; -/* Appletalk AARP headers */ +/* AppleTalk AARP headers */ struct elapaarp { diff --git a/include/linux/atari_rootsec.h b/include/linux/atari_rootsec.h new file mode 100644 index 000000000..09745f7a0 --- /dev/null +++ b/include/linux/atari_rootsec.h @@ -0,0 +1,34 @@ +#ifndef _LINUX_ATARI_ROOTSEC_H +#define _LINUX_ATARI_ROOTSEC_H + +/* + * linux/include/linux/atari_rootsec.h + * definitions for Atari Rootsector layout + * by Andreas Schwab (schwab@ls5.informatik.uni-dortmund.de) + * + * modified for ICD/Supra partitioning scheme restricted to at most 12 + * partitions + * by Guenther Kelleter (guenther@pool.informatik.rwth-aachen.de) + */ + +struct partition_info +{ + u_char flg; /* bit 0: active; bit 7: bootable */ + char id[3]; /* "GEM", "BGM", "XGM", or other */ + u32 st; /* start of partition */ + u32 siz; /* length of partition */ +}; + +struct rootsector +{ + char unused[0x156]; /* room for boot code */ + struct partition_info icdpart[8]; /* info for ICD-partitions 5..12 */ + char unused2[0xc]; + u32 hd_siz; /* size of disk in blocks */ + struct partition_info part[4]; + u32 bsl_st; /* start of bad sector list */ + u32 bsl_cnt; /* length of bad sector list */ + u16 checksum; /* checksum for bootable disks */ +} __attribute__ ((__packed__)); + +#endif /* _LINUX_ATARI_ROOTSEC_H */ diff --git a/include/linux/ax25.h b/include/linux/ax25.h index 8958e177e..1e492c8ff 100644 --- a/include/linux/ax25.h +++ b/include/linux/ax25.h @@ -7,7 +7,7 @@ #define AX25_KERNEL_H #define AX25_MTU 256 -#define AX25_MAX_DIGIS 6 /* This is wrong, should be 8 */ +#define AX25_MAX_DIGIS 8 #define AX25_WINDOW 1 #define AX25_T1 2 @@ -71,11 +71,13 @@ struct ax25_route_opt_struct { }; struct ax25_ctl_struct { - ax25_address port_addr; - ax25_address source_addr; - ax25_address dest_addr; - unsigned int cmd; - unsigned long arg; + ax25_address port_addr; + ax25_address source_addr; + ax25_address dest_addr; + unsigned int cmd; + unsigned long arg; + unsigned char digi_count; + ax25_address digi_addr[AX25_MAX_DIGIS]; }; struct ax25_info_struct { diff --git a/include/linux/bitops.h b/include/linux/bitops.h new file mode 100644 index 000000000..ddb84dd62 --- /dev/null +++ b/include/linux/bitops.h @@ -0,0 +1,72 @@ +#ifndef _LINUX_BITOPS_H +#define _LINUX_BITOPS_H + + +/* + * ffs: find first bit set. This is defined the same way as + * the libc and compiler builtin ffs routines, therefore + * differs in spirit from the above ffz (man ffs). + */ + +extern __inline__ int generic_ffs(int x) +{ + int r = 1; + + if (!x) + return 0; + if (!(x & 0xffff)) { + x >>= 16; + r += 16; + } + if (!(x & 0xff)) { + x >>= 8; + r += 8; + } + if (!(x & 0xf)) { + x >>= 4; + r += 4; + } + if (!(x & 3)) { + x >>= 2; + r += 2; + } + if (!(x & 1)) { + x >>= 1; + r += 1; + } + return r; +} + +/* + * hweightN: returns the hamming weight (i.e. the number + * of bits set) of a N-bit word + */ + +extern __inline__ unsigned int generic_hweight32(unsigned int w) +{ + unsigned int res = (w & 0x55555555) + ((w >> 1) & 0x55555555); + res = (res & 0x33333333) + ((res >> 2) & 0x33333333); + res = (res & 0x0F0F0F0F) + ((res >> 4) & 0x0F0F0F0F); + res = (res & 0x00FF00FF) + ((res >> 8) & 0x00FF00FF); + return (res & 0x0000FFFF) + ((res >> 16) & 0x0000FFFF); +} + +extern __inline__ unsigned int generic_hweight16(unsigned int w) +{ + unsigned int res = (w & 0x5555) + ((w >> 1) & 0x5555); + res = (res & 0x3333) + ((res >> 2) & 0x3333); + res = (res & 0x0F0F) + ((res >> 4) & 0x0F0F); + return (res & 0x00FF) + ((res >> 8) & 0x00FF); +} + +extern __inline__ unsigned int generic_hweight8(unsigned int w) +{ + unsigned int res = (w & 0x55) + ((w >> 1) & 0x55); + res = (res & 0x33) + ((res >> 2) & 0x33); + return (res & 0x0F) + ((res >> 4) & 0x0F); +} + +#include <asm/bitops.h> + + +#endif diff --git a/include/linux/blk.h b/include/linux/blk.h index d7dc45db6..e069791f2 100644 --- a/include/linux/blk.h +++ b/include/linux/blk.h @@ -32,21 +32,6 @@ extern spinlock_t io_request_lock; (s1)->sector < (s2)->sector))) /* - * These will have to be changed to be aware of different buffer - * sizes etc.. It actually needs a major cleanup. - */ -#if defined(IDE_DRIVER) || defined(MD_DRIVER) -#define SECTOR_MASK ((BLOCK_SIZE >> 9) - 1) -#else -#define SECTOR_MASK (blksize_size[MAJOR_NR] && \ - blksize_size[MAJOR_NR][MINOR(CURRENT->rq_dev)] ? \ - ((blksize_size[MAJOR_NR][MINOR(CURRENT->rq_dev)] >> 9) - 1) : \ - ((BLOCK_SIZE >> 9) - 1)) -#endif /* IDE_DRIVER */ - -#define SUBSECTOR(block) (CURRENT->current_nr_sectors > 0) - -/* * Initialization functions. */ extern int isp16_init(void); @@ -65,12 +50,18 @@ extern int cdi_init(void); extern int hd_init(void); extern int ide_init(void); extern int xd_init(void); +extern int mfm_init(void); extern int loop_init(void); extern int md_init(void); extern int ap_init(void); extern int ddv_init(void); extern int z2_init(void); extern int swim3_init(void); +extern int amiga_floppy_init(void); +extern int atari_floppy_init(void); +extern int nbd_init(void); +extern int ez_init(void); +extern int bpcd_init(void); extern int ps2esdi_init(void); extern void set_device_ro(kdev_t dev,int flag); @@ -112,6 +103,7 @@ void initrd_init(void); #define DEVICE_NR(device) (MINOR(device) >> PARTN_BITS) #define DEVICE_ON(device) /* nothing */ #define DEVICE_OFF(device) /* nothing */ +#define DEVICE_NAME "ide" #elif (MAJOR_NR == RAMDISK_MAJOR) @@ -145,8 +137,8 @@ static void floppy_off(unsigned int nr); #elif (MAJOR_NR == HD_MAJOR) -/* harddisk: timeout is 6 seconds.. */ -#define DEVICE_NAME "harddisk" +/* Hard disk: timeout is 6 seconds. */ +#define DEVICE_NAME "hard disk" #define DEVICE_INTR do_hd #define DEVICE_TIMEOUT HD_TIMER #define TIMEOUT_VALUE (6*HZ) @@ -300,7 +292,7 @@ static void floppy_off(unsigned int nr); #define DEVICE_OFF(device) #elif (MAJOR_NR == CM206_CDROM_MAJOR) -#define DEVICE_NAME "Philips/LMS cd-rom cm206" +#define DEVICE_NAME "Philips/LMS CD-ROM cm206" #define DEVICE_REQUEST do_cm206_request #define DEVICE_NR(device) (MINOR(device)) #define DEVICE_ON(device) @@ -338,6 +330,32 @@ static void floppy_off(unsigned int nr); #define DEVICE_ON(device) #define DEVICE_OFF(device) +#elif (MAJOR_NR == MFM_ACORN_MAJOR) + +#define DEVICE_NAME "mfm disk" +#define DEVICE_INTR do_mfm +#define DEVICE_REQUEST do_mfm_request +#define DEVICE_NR(device) (MINOR(device) >> 6) +#define DEVICE_ON(device) +#define DEVICE_OFF(device) + +#elif (MAJOR_NR == MFM_ACORN_MAJOR) + +#define DEVICE_NAME "mfm disk" +#define DEVICE_INTR do_mfm +#define DEVICE_REQUEST do_mfm_request +#define DEVICE_NR(device) (MINOR(device) >> 6) +#define DEVICE_ON(device) +#define DEVICE_OFF(device) + +#elif (MAJOR_NR == NBD_MAJOR) + +#define DEVICE_NAME "nbd" +#define DEVICE_REQUEST do_nbd_request +#define DEVICE_NR(device) (MINOR(device)) +#define DEVICE_ON(device) +#define DEVICE_OFF(device) + #endif /* MAJOR_NR == whatever */ #if (MAJOR_NR != SCSI_TAPE_MAJOR) @@ -347,11 +365,16 @@ static void floppy_off(unsigned int nr); #define CURRENT (blk_dev[MAJOR_NR].current_request) #endif +#ifndef DEVICE_NAME +#define DEVICE_NAME "unknown" +#endif + #define CURRENT_DEV DEVICE_NR(CURRENT->rq_dev) #ifdef DEVICE_INTR static void (*DEVICE_INTR)(void) = NULL; #endif + #ifdef DEVICE_TIMEOUT #define SET_TIMER \ @@ -395,89 +418,40 @@ static void (DEVICE_REQUEST)(void); #endif /* !defined(IDE_DRIVER) */ -/* end_request() - SCSI devices have their own version */ -/* - IDE drivers have their own copy too */ - -#if ! SCSI_BLK_MAJOR(MAJOR_NR) - /* - * The [*_]end_request() handler has to be called with the request queue - * spinlock aquired. All functions called within end_request() _must be_ - * atomic. + * end_request() and friends. Must be called with the request queue spinlock + * acquired. All functions called within end_request() _must_be_ atomic. + * + * Several drivers define their own end_request and call end_that_request_first() + * and end_that_request_last() for parts of the original function. This prevents + * code duplication in drivers. */ -#if defined(IDE_DRIVER) && !defined(_IDE_C) /* shared copy for IDE modules */ -void ide_end_request(byte uptodate, ide_hwgroup_t *hwgroup); -#else -#ifdef IDE_DRIVER -void ide_end_request(byte uptodate, ide_hwgroup_t *hwgroup) { - int nsect; - struct buffer_head *bh; - struct request *req; - unsigned long flags; - - spin_lock_irqsave(&io_request_lock,flags); - req = hwgroup->rq; -#else +int end_that_request_first(struct request *req, int uptodate, char *name); +void end_that_request_last(struct request *req); + +#ifndef LOCAL_END_REQUEST /* If we have our own end_request, we do not want to include this mess */ + +#if ! SCSI_BLK_MAJOR(MAJOR_NR) + static void end_request(int uptodate) { - int nsect; - struct buffer_head *bh; struct request *req = CURRENT; -#endif /* IDE_DRIVER */ - req->errors = 0; - if (!uptodate) { - printk("end_request: I/O error, dev %s, sector %lu\n", - kdevname(req->rq_dev), req->sector); - if ((bh = req->bh) != NULL) { - nsect = bh->b_size >> 9; - req->nr_sectors--; - req->nr_sectors &= ~(nsect - 1); - req->sector += nsect; - req->sector &= ~(nsect - 1); - } - } + if (end_that_request_first(req, uptodate, DEVICE_NAME)) + return; - if ((bh = req->bh) != NULL) { - req->bh = bh->b_reqnext; - bh->b_reqnext = NULL; - bh->b_end_io(bh, uptodate); - if ((bh = req->bh) != NULL) { - req->current_nr_sectors = bh->b_size >> 9; - if (req->nr_sectors < req->current_nr_sectors) { - req->nr_sectors = req->current_nr_sectors; - printk("end_request: buffer-list destroyed\n"); - } - req->buffer = bh->b_data; -#ifdef IDE_DRIVER - spin_unlock_irqrestore(&io_request_lock,flags); -#endif /* IDE_DRIVER */ - return; - } - } #ifndef DEVICE_NO_RANDOM add_blkdev_randomness(MAJOR(req->rq_dev)); #endif -#ifdef IDE_DRIVER - hwgroup->drive->queue = req->next; - blk_dev[MAJOR(req->rq_dev)].current_request = NULL; - hwgroup->rq = NULL; -#else DEVICE_OFF(req->rq_dev); CURRENT = req->next; -#endif /* IDE_DRIVER */ - if (req->sem != NULL) - up(req->sem); - req->rq_status = RQ_INACTIVE; - wake_up(&wait_for_request); -#ifdef IDE_DRIVER - spin_unlock_irqrestore(&io_request_lock,flags); -#endif /* IDE_DRIVER */ + end_that_request_last(req); } -#endif /* defined(IDE_DRIVER) && !defined(_IDE_C) */ + #endif /* ! SCSI_BLK_MAJOR(MAJOR_NR) */ -#endif /* (MAJOR_NR != SCSI_TAPE_MAJOR) */ +#endif /* LOCAL_END_REQUEST */ +#endif /* (MAJOR_NR != SCSI_TAPE_MAJOR) */ #endif /* defined(MAJOR_NR) || defined(IDE_DRIVER) */ #endif /* _BLK_H */ diff --git a/include/linux/bpqether.h b/include/linux/bpqether.h index cc7d35831..a6c35e1a8 100644 --- a/include/linux/bpqether.h +++ b/include/linux/bpqether.h @@ -20,7 +20,7 @@ struct bpq_ethaddr { /* * For SIOCSBPQETHOPT - this is compatible with PI2/PacketTwin card drivers, * currently not implemented, though. If someone wants to hook a radio - * to his ethernet card he may find this useful... ;-) + * to his Ethernet card he may find this useful. ;-) */ #define SIOCGBPQETHPARAM 0x5000 /* get Level 1 parameters */ diff --git a/include/linux/byteorder/generic.h b/include/linux/byteorder/generic.h index 633f7b90a..5200dc1ad 100644 --- a/include/linux/byteorder/generic.h +++ b/include/linux/byteorder/generic.h @@ -55,7 +55,7 @@ * __constant_htons(__u16 x) * * Conversion of XX-bit integers (16- 32- or 64-) - * between native cpu format and little/big endian format + * between native CPU format and little/big endian format * 64-bit stuff only defined for proper architectures * cpu_to_[bl]eXX(__uXX x) * [bl]eXX_to_cpu(__uXX x) diff --git a/include/linux/byteorder/swab.h b/include/linux/byteorder/swab.h index 8110bfb85..7c1f5c985 100644 --- a/include/linux/byteorder/swab.h +++ b/include/linux/byteorder/swab.h @@ -3,7 +3,7 @@ /* * linux/byteorder/swab.h - * Byteswapping, independently from cpu endianness + * Byte-swapping, independently from CPU endianness * swabXX[ps]?(foo) * * Francois-Rene Rideau <rideau@ens.fr> 19971205 diff --git a/include/linux/capability.h b/include/linux/capability.h index a0342601f..3f5260c02 100644 --- a/include/linux/capability.h +++ b/include/linux/capability.h @@ -305,7 +305,7 @@ static inline kernel_cap_t cap_invert(kernel_cap_t c) #define cap_set_full(c) do { (c).cap = ~0; } while(0) #define cap_mask(c,mask) do { (c).cap &= (mask).cap; } while(0) -#define cap_is_fs_cap(c) ((c) & CAP_FS_MASK) +#define cap_is_fs_cap(c) (CAP_TO_MASK(c) & CAP_FS_MASK) #endif /* __KERNEL__ */ diff --git a/include/linux/coda.h b/include/linux/coda.h index 5c3cb563e..9cdf0d04b 100644 --- a/include/linux/coda.h +++ b/include/linux/coda.h @@ -148,8 +148,8 @@ static inline ino_t coda_f2i(struct ViceFid *fid) #ifndef _VUID_T_ #define _VUID_T_ -typedef u_long vuid_t; -typedef u_long vgid_t; +typedef unsigned int vuid_t; +typedef unsigned int vgid_t; #endif /*_VUID_T_ */ #ifndef _CODACRED_T_ @@ -223,7 +223,7 @@ struct coda_vattr { #define CFS_PURGEUSER ((u_long) 26) #define CFS_ZAPFILE ((u_long) 27) #define CFS_ZAPDIR ((u_long) 28) -#define CFS_ZAPVNODE ((u_long) 29) +/* #define CFS_ZAPVNODE ((u_long) 29) obsolete */ #define CFS_PURGEFID ((u_long) 30) #define CFS_OPEN_BY_PATH ((u_long) 31) #define CFS_NCALLS 32 diff --git a/include/linux/coda_linux.h b/include/linux/coda_linux.h index 9dd30eaeb..e867226ec 100644 --- a/include/linux/coda_linux.h +++ b/include/linux/coda_linux.h @@ -48,6 +48,7 @@ static __inline__ struct ViceFid *coda_i2f(struct inode *); char *coda_f2s(ViceFid *f); int coda_isroot(struct inode *i); int coda_fid_is_volroot(struct ViceFid *); +int coda_fid_is_weird(struct ViceFid *fid); int coda_iscontrol(const char *name, size_t length); diff --git a/include/linux/coda_psdev.h b/include/linux/coda_psdev.h index 73600b8ba..7b827e8c3 100644 --- a/include/linux/coda_psdev.h +++ b/include/linux/coda_psdev.h @@ -74,7 +74,7 @@ int venus_mkdir(struct super_block *sb, struct ViceFid *dirfid, const char *name, int length, struct ViceFid *newfid, struct coda_vattr *attrs); int venus_create(struct super_block *sb, struct ViceFid *dirfid, - const char *name, int length, int excl, int mode, + const char *name, int length, int excl, int mode, int rdev, struct ViceFid *newfid, struct coda_vattr *attrs) ; int venus_rmdir(struct super_block *sb, struct ViceFid *dirfid, const char *name, int length); diff --git a/include/linux/console.h b/include/linux/console.h index e287e64d5..0fdb484d6 100644 --- a/include/linux/console.h +++ b/include/linux/console.h @@ -14,9 +14,8 @@ #ifndef _LINUX_CONSOLE_H_ #define _LINUX_CONSOLE_H_ 1 -#define NPAR 16 - struct vc_data; +struct console_font_op; /* * this is what the terminal answers to a ESC-Z or csi0c query. @@ -24,27 +23,38 @@ struct vc_data; #define VT100ID "\033[?1;2c" #define VT102ID "\033[?6c" -/* DPC: 1994-04-13 !!! con_putcs is new entry !!! */ - struct consw { - unsigned long (*con_startup)(unsigned long, const char **); - void (*con_init)(struct vc_data *); - int (*con_deinit)(struct vc_data *); - int (*con_clear)(struct vc_data *, int, int, int, int); - int (*con_putc)(struct vc_data *, int, int, int); - int (*con_putcs)(struct vc_data *, const char *, int, int, int); - int (*con_cursor)(struct vc_data *, int); - int (*con_scroll)(struct vc_data *, int, int, int, int); - int (*con_bmove)(struct vc_data *, int, int, int, int, int, int); - int (*con_switch)(struct vc_data *); - int (*con_blank)(int); - int (*con_get_font)(struct vc_data *, int *, int *, char *); - int (*con_set_font)(struct vc_data *, int, int, char *); - int (*con_set_palette)(struct vc_data *, unsigned char *); + const char *(*con_startup)(void); + void (*con_init)(struct vc_data *, int); + void (*con_deinit)(struct vc_data *); + void (*con_clear)(struct vc_data *, int, int, int, int); + void (*con_putc)(struct vc_data *, int, int, int); + void (*con_putcs)(struct vc_data *, const unsigned short *, int, int, int); + void (*con_cursor)(struct vc_data *, int); + int (*con_scroll)(struct vc_data *, int, int, int, int); + void (*con_bmove)(struct vc_data *, int, int, int, int, int, int); + int (*con_switch)(struct vc_data *); + int (*con_blank)(struct vc_data *, int); + int (*con_font_op)(struct vc_data *, struct console_font_op *); + int (*con_set_palette)(struct vc_data *, unsigned char *); + int (*con_scrolldelta)(struct vc_data *, int); + int (*con_set_origin)(struct vc_data *); + void (*con_save_screen)(struct vc_data *); + u8 (*con_build_attr)(struct vc_data *, u8, u8, u8, u8, u8); + void (*con_invert_region)(struct vc_data *, u16 *, int); }; extern struct consw *conswitchp; +extern struct consw dummy_con; /* dummy console buffer */ +extern struct consw fb_con; /* frame buffer based console */ +extern struct consw vga_con; /* VGA text console */ +extern struct consw newport_con; /* SGI Newport console */ +extern struct consw compat_con; /* console wrapper */ +extern struct consw prom_con; /* SPARC PROM console */ + +void take_over_console(struct consw *sw, int first, int last, int deflt); + /* flag bits */ #define CON_INITED (1) @@ -59,9 +69,6 @@ extern struct consw *conswitchp; #define CM_ERASE (2) #define CM_MOVE (3) -struct tty_struct; -int tioclinux(struct tty_struct *tty, unsigned long arg); - /* * Array of consoles built from command line options (console=) */ @@ -102,4 +109,10 @@ extern void register_console(struct console *); extern int unregister_console(struct console *); extern struct console *console_drivers; -#endif /* linux/console.h */ +/* VESA Blanking Levels */ +#define VESA_NO_BLANKING 0 +#define VESA_VSYNC_SUSPEND 1 +#define VESA_HSYNC_SUSPEND 2 +#define VESA_POWERDOWN 3 + +#endif /* _LINUX_CONSOLE_H */ diff --git a/include/linux/console_struct.h b/include/linux/console_struct.h index 99ed0e347..dafd1c299 100644 --- a/include/linux/console_struct.h +++ b/include/linux/console_struct.h @@ -1,69 +1,73 @@ /* * console_struct.h * - * Data structure and defines shared between console.c, vga.c and tga.c + * Data structure describing single virtual console except for data + * used by vt.c. + * + * Fields marked with [#] must be set by the low-level driver. + * Fields marked with [!] can be changed by the low-level driver + * to achieve effects such as fast scrolling by changing the origin. */ -#include <linux/config.h> - #define NPAR 16 struct vc_data { - unsigned long vc_screenbuf_size; + unsigned short vc_num; /* Console number */ + unsigned int vc_cols; /* [#] Console size */ + unsigned int vc_rows; + unsigned int vc_size_row; /* Bytes per row */ + struct consw *vc_sw; + unsigned short *vc_screenbuf; /* In-memory character/attribute buffer */ + unsigned int vc_screenbuf_size; unsigned short vc_video_erase_char; /* Background erase character */ unsigned char vc_attr; /* Current attributes */ unsigned char vc_def_color; /* Default colors */ unsigned char vc_color; /* Foreground & background */ unsigned char vc_s_color; /* Saved foreground & background */ - unsigned char vc_ulcolor; /* Colour for underline mode */ - unsigned char vc_halfcolor; /* Colour for half intensity mode */ - unsigned long vc_origin; /* Used for EGA/VGA fast scroll */ - unsigned long vc_scr_end; /* Used for EGA/VGA fast scroll */ - unsigned long vc_x,vc_y; - unsigned long vc_top,vc_bottom; - unsigned long vc_state; - unsigned long vc_npar,vc_par[NPAR]; -#ifdef CONFIG_FB_CONSOLE - unsigned short *vc_video_mem_start; /* Start of video RAM */ - unsigned short *vc_pos; -#else - unsigned long vc_pos; - unsigned long vc_video_mem_start; /* Start of video RAM */ -#endif - unsigned long vc_video_mem_end; /* End of video RAM (sort of) */ - unsigned long vc_saved_x; - unsigned long vc_saved_y; + unsigned char vc_ulcolor; /* Color for underline mode */ + unsigned char vc_halfcolor; /* Color for half intensity mode */ + unsigned short vc_complement_mask; /* [#] Xor mask for mouse pointer */ + unsigned short vc_hi_font_mask; /* [#] Attribute set for upper 256 chars of font or 0 if not supported */ + unsigned int vc_x, vc_y; /* Cursor position */ + unsigned int vc_top, vc_bottom; /* Scrolling region */ + unsigned int vc_state; /* Escape sequence parser state */ + unsigned int vc_npar,vc_par[NPAR]; /* Parameters of current escape sequence */ + unsigned long vc_origin; /* [!] Start of real screen */ + unsigned long vc_scr_end; /* [!] End of real screen */ + unsigned long vc_visible_origin; /* [!] Top of visible window */ + unsigned long vc_pos; /* Cursor address */ + unsigned int vc_saved_x; + unsigned int vc_saved_y; /* mode flags */ - unsigned long vc_charset : 1; /* Character set G0 / G1 */ - unsigned long vc_s_charset : 1; /* Saved character set */ - unsigned long vc_disp_ctrl : 1; /* Display chars < 32? */ - unsigned long vc_toggle_meta : 1; /* Toggle high bit? */ - unsigned long vc_decscnm : 1; /* Screen Mode */ - unsigned long vc_decom : 1; /* Origin Mode */ - unsigned long vc_decawm : 1; /* Autowrap Mode */ - unsigned long vc_deccm : 1; /* Cursor Visible */ - unsigned long vc_decim : 1; /* Insert Mode */ - unsigned long vc_deccolm : 1; /* 80/132 Column Mode */ + unsigned int vc_charset : 1; /* Character set G0 / G1 */ + unsigned int vc_s_charset : 1; /* Saved character set */ + unsigned int vc_disp_ctrl : 1; /* Display chars < 32? */ + unsigned int vc_toggle_meta : 1; /* Toggle high bit? */ + unsigned int vc_decscnm : 1; /* Screen Mode */ + unsigned int vc_decom : 1; /* Origin Mode */ + unsigned int vc_decawm : 1; /* Autowrap Mode */ + unsigned int vc_deccm : 1; /* Cursor Visible */ + unsigned int vc_decim : 1; /* Insert Mode */ + unsigned int vc_deccolm : 1; /* 80/132 Column Mode */ /* attribute flags */ - unsigned long vc_intensity : 2; /* 0=half-bright, 1=normal, 2=bold */ - unsigned long vc_underline : 1; - unsigned long vc_blink : 1; - unsigned long vc_reverse : 1; - unsigned long vc_s_intensity : 2; /* saved rendition */ - unsigned long vc_s_underline : 1; - unsigned long vc_s_blink : 1; - unsigned long vc_s_reverse : 1; + unsigned int vc_intensity : 2; /* 0=half-bright, 1=normal, 2=bold */ + unsigned int vc_underline : 1; + unsigned int vc_blink : 1; + unsigned int vc_reverse : 1; + unsigned int vc_s_intensity : 2; /* saved rendition */ + unsigned int vc_s_underline : 1; + unsigned int vc_s_blink : 1; + unsigned int vc_s_reverse : 1; /* misc */ - unsigned long vc_ques : 1; - unsigned long vc_need_wrap : 1; - unsigned long vc_can_do_color : 1; - unsigned long vc_has_scrolled : 1; /* Info for unblank_screen */ - unsigned long vc_kmalloced : 1; /* kfree_s() needed */ - unsigned long vc_report_mouse : 2; + unsigned int vc_ques : 1; + unsigned int vc_need_wrap : 1; + unsigned int vc_can_do_color : 1; + unsigned int vc_report_mouse : 2; + unsigned int vc_kmalloced : 1; unsigned char vc_utf : 1; /* Unicode UTF-8 encoding */ unsigned char vc_utf_count; - long vc_utf_char; - unsigned long vc_tab_stop[5]; /* Tab stops. 160 columns. */ + int vc_utf_char; + unsigned int vc_tab_stop[5]; /* Tab stops. 160 columns. */ unsigned char vc_palette[16*3]; /* Colour palette for VGA+ */ unsigned short * vc_translate; unsigned char vc_G0_charset; @@ -72,6 +76,10 @@ struct vc_data { unsigned char vc_saved_G1; unsigned int vc_bell_pitch; /* Console bell pitch */ unsigned int vc_bell_duration; /* Console bell duration */ + unsigned int vc_cursor_type; + struct vc_data **vc_display_fg; /* [!] Ptr to var holding fg console for this display */ + unsigned long vc_uni_pagedir; + unsigned long *vc_uni_pagedir_loc; /* [!] Location of uni_pagedir variable for this console */ /* additional information is in vt_kern.h */ }; @@ -85,65 +93,14 @@ struct vc { extern struct vc vc_cons [MAX_NR_CONSOLES]; -#define screenbuf_size (vc_cons[currcons].d->vc_screenbuf_size) -#define origin (vc_cons[currcons].d->vc_origin) -#define scr_end (vc_cons[currcons].d->vc_scr_end) -#define pos (vc_cons[currcons].d->vc_pos) -#define top (vc_cons[currcons].d->vc_top) -#define bottom (vc_cons[currcons].d->vc_bottom) -#define x (vc_cons[currcons].d->vc_x) -#define y (vc_cons[currcons].d->vc_y) -#define vc_state (vc_cons[currcons].d->vc_state) -#define npar (vc_cons[currcons].d->vc_npar) -#define par (vc_cons[currcons].d->vc_par) -#define ques (vc_cons[currcons].d->vc_ques) -#define attr (vc_cons[currcons].d->vc_attr) -#define saved_x (vc_cons[currcons].d->vc_saved_x) -#define saved_y (vc_cons[currcons].d->vc_saved_y) -#define translate (vc_cons[currcons].d->vc_translate) -#define G0_charset (vc_cons[currcons].d->vc_G0_charset) -#define G1_charset (vc_cons[currcons].d->vc_G1_charset) -#define saved_G0 (vc_cons[currcons].d->vc_saved_G0) -#define saved_G1 (vc_cons[currcons].d->vc_saved_G1) -#define utf (vc_cons[currcons].d->vc_utf) -#define utf_count (vc_cons[currcons].d->vc_utf_count) -#define utf_char (vc_cons[currcons].d->vc_utf_char) -#define video_mem_start (vc_cons[currcons].d->vc_video_mem_start) -#define video_mem_end (vc_cons[currcons].d->vc_video_mem_end) -#define video_erase_char (vc_cons[currcons].d->vc_video_erase_char) -#define disp_ctrl (vc_cons[currcons].d->vc_disp_ctrl) -#define toggle_meta (vc_cons[currcons].d->vc_toggle_meta) -#define decscnm (vc_cons[currcons].d->vc_decscnm) -#define decom (vc_cons[currcons].d->vc_decom) -#define decawm (vc_cons[currcons].d->vc_decawm) -#define deccm (vc_cons[currcons].d->vc_deccm) -#define decim (vc_cons[currcons].d->vc_decim) -#define deccolm (vc_cons[currcons].d->vc_deccolm) -#define need_wrap (vc_cons[currcons].d->vc_need_wrap) -#define has_scrolled (vc_cons[currcons].d->vc_has_scrolled) -#define kmalloced (vc_cons[currcons].d->vc_kmalloced) -#define report_mouse (vc_cons[currcons].d->vc_report_mouse) -#define color (vc_cons[currcons].d->vc_color) -#define s_color (vc_cons[currcons].d->vc_s_color) -#define def_color (vc_cons[currcons].d->vc_def_color) -#define foreground (color & 0x0f) -#define background (color & 0xf0) -#define charset (vc_cons[currcons].d->vc_charset) -#define s_charset (vc_cons[currcons].d->vc_s_charset) -#define intensity (vc_cons[currcons].d->vc_intensity) -#define underline (vc_cons[currcons].d->vc_underline) -#define blink (vc_cons[currcons].d->vc_blink) -#define reverse (vc_cons[currcons].d->vc_reverse) -#define s_intensity (vc_cons[currcons].d->vc_s_intensity) -#define s_underline (vc_cons[currcons].d->vc_s_underline) -#define s_blink (vc_cons[currcons].d->vc_s_blink) -#define s_reverse (vc_cons[currcons].d->vc_s_reverse) -#define ulcolor (vc_cons[currcons].d->vc_ulcolor) -#define halfcolor (vc_cons[currcons].d->vc_halfcolor) -#define tab_stop (vc_cons[currcons].d->vc_tab_stop) -#define palette (vc_cons[currcons].d->vc_palette) -#define bell_pitch (vc_cons[currcons].d->vc_bell_pitch) -#define bell_duration (vc_cons[currcons].d->vc_bell_duration) +#define CUR_DEF 0 +#define CUR_NONE 1 +#define CUR_UNDERLINE 2 +#define CUR_LOWER_THIRD 3 +#define CUR_LOWER_HALF 4 +#define CUR_TWO_THIRDS 5 +#define CUR_BLOCK 6 +#define CUR_HWMASK 0x0f +#define CUR_SWMASK 0xfff0 -#define vcmode (vt_cons[currcons]->vc_mode) -#define structsize (sizeof(struct vc_data) + sizeof(struct vt_struct)) +#define CUR_DEFAULT CUR_UNDERLINE diff --git a/include/linux/consolemap.h b/include/linux/consolemap.h index 9aba19db3..fd0bcd43f 100644 --- a/include/linux/consolemap.h +++ b/include/linux/consolemap.h @@ -8,7 +8,8 @@ #define IBMPC_MAP 2 #define USER_MAP 3 -extern int hashtable_contents_valid; -extern unsigned char inverse_translate(int glyph); +struct vc_data; + +extern unsigned char inverse_translate(struct vc_data *conp, int glyph); extern unsigned short *set_translate(int m); -extern int conv_uni_to_pc(long ucs); +extern int conv_uni_to_pc(struct vc_data *conp, long ucs); diff --git a/include/linux/cyclades.h b/include/linux/cyclades.h index f5ef3f250..024104c31 100644 --- a/include/linux/cyclades.h +++ b/include/linux/cyclades.h @@ -1,4 +1,4 @@ -/* $Revision: 2.3 $$Date: 1998/03/16 18:01:12 $ +/* $Revision: 2.6 $$Date: 1998/08/10 16:57:01 $ * linux/include/linux/cyclades.h * * This file is maintained by Ivan Passos <ivan@cyclades.com>, @@ -7,10 +7,17 @@ * * This file contains the general definitions for the cyclades.c driver *$Log: cyclades.h,v $ + *Revision 2.5 1998/08/03 16:57:01 ivan + *added cyclades_idle_stats structure; + * + *Revision 2.4 1998/06/01 12:09:53 ivan + *removed closing_wait2 from cyclades_port structure; + * *Revision 2.3 1998/03/16 18:01:12 ivan *changes in the cyclades_port structure to get it closer to the *standard serial port structure; *added constants for new ioctls; + * *Revision 2.2 1998/02/17 16:50:00 ivan *changes in the cyclades_port structure (addition of shutdown_wait and *chip_rev variables); @@ -56,6 +63,22 @@ struct cyclades_monitor { unsigned long char_last; }; +/* + * These stats all reflect activity since the device was last initialized. + * (i.e., since the port was opened with no other processes already having it + * open) + */ +struct cyclades_idle_stats { + time_t in_use; /* Time device has been in use (secs) */ + time_t recv_idle; /* Time since last char received (secs) */ + time_t xmit_idle; /* Time since last char transmitted (secs) */ + unsigned long recv_bytes; /* Bytes received */ + unsigned long xmit_bytes; /* Bytes transmitted */ + unsigned long overruns; /* Input overruns */ + unsigned long frame_errs; /* Input framing errors */ + unsigned long parity_errs; /* Input parity errors */ +}; + #define CYCLADES_MAGIC 0x4359 #define CYGETMON 0x435901 @@ -71,11 +94,12 @@ struct cyclades_monitor { #define CYGETRFLOW 0x43590b #define CYSETRTSDTR_INV 0x43590c #define CYGETRTSDTR_INV 0x43590d -#define CYZPOLLCYCLE 0x43590e -#define CYGETCD1400VER 0x43590f -#define CYGETCARDINFO 0x435910 -#define CYSETWAIT 0x435911 -#define CYGETWAIT 0x435912 +#define CYZSETPOLLCYCLE 0x43590e +#define CYZGETPOLLCYCLE 0x43590f +#define CYGETCD1400VER 0x435910 +#define CYGETCARDINFO 0x435911 +#define CYSETWAIT 0x435912 +#define CYGETWAIT 0x435913 /*************** CYCLOM-Z ADDITIONS ***************/ @@ -89,8 +113,8 @@ struct cyclades_monitor { #define CZ_DEF_POLL (HZ/25) #define MAX_BOARD 4 /* Max number of boards */ -#define MAX_PORT 128 /* Max number of ports per board */ #define MAX_DEV 256 /* Max number of ports total */ +#define CYZ_MAX_SPEED 921600 #define CYZ_FIFO_SIZE 16 @@ -468,7 +492,7 @@ struct cyclades_card { long base_addr; long ctl_addr; int irq; - int num_chips; /* 0 if card absent, 1 if Z/PCI, else Y */ + int num_chips; /* 0 if card absent, -1 if Z/PCI, else Y */ int first_line; /* minor number of first channel on card */ int bus_index; /* address shift - 0 for ISA, 1 for PCI */ int inact_ctrl; /* FW Inactivity control - 0 disabled, 1 enabled */ @@ -508,7 +532,6 @@ struct cyclades_port { int x_char; /* to be pushed out ASAP */ int close_delay; unsigned short closing_wait; - unsigned short closing_wait2; unsigned long event; unsigned long last_active; int count; /* # of fd on device */ @@ -531,6 +554,7 @@ struct cyclades_port { struct cyclades_monitor mon; unsigned long jiffies[3]; unsigned long rflush_count; + struct cyclades_idle_stats idle_stats; }; /* @@ -544,11 +568,15 @@ struct cyclades_port { #define Cy_EVENT_OPEN_WAKEUP 4 #define Cy_EVENT_SHUTDOWN_WAKEUP 5 -#define CLOSING_WAIT_DELAY 30 +#define CLOSING_WAIT_DELAY 30*HZ +#define CY_CLOSING_WAIT_NONE 65535 +#define CY_CLOSING_WAIT_INF 0 + #define CyMAX_CHIPS_PER_CARD 8 #define CyMAX_CHAR_FIFO 12 #define CyPORTS_PER_CHIP 4 +#define CD1400_MAX_SPEED 115200 #define CyISA_Ywin 0x2000 diff --git a/include/linux/dcache.h b/include/linux/dcache.h index b3424c167..b546fb5af 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h @@ -50,6 +50,8 @@ static __inline__ unsigned int full_name_hash(const char * name, unsigned int le return end_name_hash(hash); } +#define DNAME_INLINE_LEN 16 + struct dentry { int d_count; unsigned int d_flags; @@ -68,6 +70,7 @@ struct dentry { struct super_block * d_sb; /* The root of the dentry tree */ unsigned long d_reftime; /* last time referenced */ void * d_fsdata; /* fs-specific data */ + unsigned char d_iname[DNAME_INLINE_LEN]; /* small names */ }; struct dentry_operations { @@ -114,6 +117,11 @@ static __inline__ void d_drop(struct dentry * dentry) INIT_LIST_HEAD(&dentry->d_hash); } +static __inline__ int dname_external(struct dentry *d) +{ + return d->d_name.name != d->d_iname; +} + /* * These are the low-level FS interfaces to the dcache.. */ @@ -138,6 +146,9 @@ extern void free_inode_memory(int); /* defined in fs/inode.c */ /* only used at mount-time */ extern struct dentry * d_alloc_root(struct inode * root_inode, struct dentry * old_root); +/* test whether root is busy without destroying dcache */ +extern int is_root_busy(struct dentry *); + /* * This adds the entry to the hash queues and initializes "d_inode". * The entry was actually filled in earlier during "d_alloc()" diff --git a/include/linux/delay.h b/include/linux/delay.h index 50b5d0b10..e1cf03d69 100644 --- a/include/linux/delay.h +++ b/include/linux/delay.h @@ -11,4 +11,27 @@ extern unsigned long loops_per_sec; #include <asm/delay.h> +/* + * Using udelay() for intervals greater than a few milliseconds can + * risk overflow for high loops_per_sec (high bogomips) machines. The + * mdelay() provides a wrapper to prevent this. For delays greater + * than MAX_UDELAY_MS milliseconds, the wrapper is used. Architecture + * specific values can be defined in asm-???/delay.h as an override. + * The 2nd mdelay() definition ensures GCC will optimize away the + * while loop for the common cases where n <= MAX_UDELAY_MS -- Paul G. + */ + +#ifndef MAX_UDELAY_MS +#define MAX_UDELAY_MS 5 +#endif + +#ifdef notdef +#define mdelay(n) (\ + {unsigned long msec=(n); while (msec--) udelay(1000);}) +#else +#define mdelay(n) (\ + (__builtin_constant_p(n) && (n)<=MAX_UDELAY_MS) ? udelay((n)*1000) : \ + ({unsigned long msec=(n); while (msec--) udelay(1000);})) +#endif + #endif /* defined(_LINUX_DELAY_H) */ diff --git a/include/linux/devpts_fs.h b/include/linux/devpts_fs.h index 9f07c969a..d9dfbb440 100644 --- a/include/linux/devpts_fs.h +++ b/include/linux/devpts_fs.h @@ -21,23 +21,28 @@ #include <linux/config.h> #include <linux/kdev_t.h> +#include <linux/tty.h> #ifdef CONFIG_DEVPTS_FS void devpts_pty_new(int, kdev_t); void devpts_pty_kill(int); +#define unix98_max_ptys NR_PTYS * UNIX98_NR_MAJORS; #elif defined(CONFIG_DEVPTS_FS_MODULE) #ifdef BUILDING_PTY_C void (*devpts_upcall_new)(int,kdev_t) = NULL; void (*devpts_upcall_kill)(int) = NULL; +unsigned int unix98_max_ptys = NR_PTYS * UNIX98_NR_MAJORS; EXPORT_SYMBOL(devpts_upcall_new); EXPORT_SYMBOL(devpts_upcall_kill); +EXPORT_SYMBOL(unix98_max_ptys); #else extern void (*devpts_upcall_new)(int,kdev_t); extern void (*devpts_upcall_kill)(int); +extern unsigned int unix98_max_ptys; #endif #ifndef BUILDING_DEVPTS diff --git a/include/linux/dio.h b/include/linux/dio.h new file mode 100644 index 000000000..087b06ec1 --- /dev/null +++ b/include/linux/dio.h @@ -0,0 +1,204 @@ +/* header file for DIO boards for the HP300 architecture. + * Maybe this should handle DIO-II later? + * The general structure of this is vaguely based on how + * the Amiga port handles Zorro boards. + * Copyright (C) Peter Maydell 05/1998 <pmaydell@chiark.greenend.org.uk> + * + * The board IDs are from the NetBSD kernel, which for once provided + * helpful comments... + * + * This goes with arch/m68k/hp300/dio.c + */ + +#ifndef _LINUX_DIO_H +#define _LINUX_DIO_H + +/* The DIO boards in a system are distinguished by 'select codes' which + * range from 0-63 (DIO) and 132-255 (DIO-II). + * The DIO board with select code sc is located at physical address + * 0x600000 + sc * 0x10000 + * So DIO cards cover [0x600000-0x800000); the areas [0x200000-0x400000) and + * [0x800000-0x1000000) are for additional space required by things + * like framebuffers. [0x400000-0x600000) is for miscellaneous internal I/O. + * On Linux, this is currently all mapped into the virtual address space + * at 0xf0000000 on bootup. + * DIO-II boards are at 0x1000000 + (sc - 132) * 0x400000 + * which is address range [0x1000000-0x20000000) -- too big to map completely, + * so currently we just don't handle DIO-II boards. It wouldn't be hard to + * do with ioremap() though. + */ +#ifdef __KERNEL__ +/* DIO/DIO-II boards all have the following 8bit registers. + * These are offsets from the base of the device. + */ +#define DIO_IDOFF 0x01 /* primary device ID */ +#define DIO_IPLOFF 0x03 /* interrupt priority level */ +#define DIO_SECIDOFF 0x15 /* secondary device ID */ +#define DIOII_SIZEOFF 0x101 /* device size, DIO-II only */ + +/* The internal HPIB device is special; this is its physaddr; its select code is 7. + * The reason why we have to treat it specially is because apparently it's broken: + * the device ID isn't consistent/reliable. *sigh* + */ +#define DIO_IHPIBADDR 0x47800 +#define DIO_IHPIBSCODE 7 + +/* If we don't have the internal HPIB defined, then treat select code 7 like + * any other. If we *do* have internal HPIB, then we just have to assume that + * select code 7 is the internal HPIB regardless of the ID register :-< + */ +#define CONFIG_IHPIB /* hack hack : not yet a proper config option */ +#ifdef CONFIG_IHPIB +#define DIO_ISIHPIB(scode) ((scode) == DIO_IHPIBSCODE) +#else +#define DIO_ISIHPIB(scode) 0 +#endif + +#define DIO_VIRADDRBASE 0xf0000000 /* vir addr where IOspace is mapped */ + +#define DIO_BASE 0x600000 /* start of DIO space */ +#define DIO_END 0x1000000 /* end of DIO space */ +#define DIO_DEVSIZE 0x10000 /* size of a DIO device */ + +#define DIOII_BASE 0x01000000 /* start of DIO-II space */ +#define DIOII_END 0x20000000 /* end of DIO-II space */ +#define DIOII_DEVSIZE 0x00400000 /* size of a DIO-II device */ + +/* Highest valid select code. If we add DIO-II support this should become + * 256 for everything except HP320, which only has DIO. + */ +#define DIO_SCMAX 32 +#define DIOII_SCBASE 132 /* lowest DIO-II select code */ +#define DIO_SCINHOLE(scode) (((scode) >= 32) && ((scode) < DIOII_SCBASE)) + +/* macros to read device IDs, given base address */ +#define DIO_ID(baseaddr) readb((baseaddr) + DIO_IDOFF) +#define DIO_SECID(baseaddr) readb((baseaddr) + DIO_SECIDOFF) + +/* extract the interrupt level */ +#define DIO_IPL(baseaddr) (((readb((baseaddr) + DIO_IPLOFF) >> 4) & 0x03) + 3) + +/* find the size of a DIO-II board's address space. + * DIO boards are all fixed length. + */ +#define DIOII_SIZE(baseaddr) ((readb((baseaddr) + DIOII_SIZEOFF) + 1) * 0x100000) + +/* general purpose macro for both DIO and DIO-II */ +#define DIO_SIZE(scode, base) (DIO_ISDIOII((scode)) ? DIOII_SIZE((base)) : DIO_DEVSIZE) + +/* The hardware has primary and secondary IDs; we encode these in a single + * int as PRIMARY ID & (SECONDARY ID << 8). + * In practice this is only important for framebuffers, + * and everybody else just sets ID fields equal to the DIO_ID_FOO value. + */ +#define DIO_ENCODE_ID(pr,sec) ((((int)sec & 0xff) << 8) & ((int)pr & 0xff)) +/* macro to determine whether a given primary ID requires a secondary ID byte */ +#define DIO_NEEDSSECID(id) ((id) == DIO_ID_FBUFFER) + +/* Now a whole slew of macros giving device IDs and descriptive strings: */ +#define DIO_ID_DCA0 0x02 /* 98644A serial */ +#define DIO_DESC_DCA0 "98644A DCA0 serial" +#define DIO_ID_DCA0REM 0x82 /* 98644A serial */ +#define DIO_DESC_DCA0REM "98644A DCA0REM serial" +#define DIO_ID_DCA1 0x42 /* 98644A serial */ +#define DIO_DESC_DCA1 "98644A DCA1 serial" +#define DIO_ID_DCA1REM 0xc2 /* 98644A serial */ +#define DIO_DESC_DCA1REM "98644A DCA1REM serial" +#define DIO_ID_DCM 0x05 /* 98642A serial MUX */ +#define DIO_DESC_DCM "98642A DCM serial MUX" +#define DIO_ID_DCMREM 0x85 /* 98642A serial MUX */ +#define DIO_DESC_DCMREM "98642A DCMREM serial MUX" +#define DIO_ID_LAN 0x15 /* 98643A LAN */ +#define DIO_DESC_LAN "98643A LAN" +#define DIO_ID_FHPIB 0x08 /* 98625A/98625B fast HP-IB */ +#define DIO_DESC_FHPIB "98625A/98625B fast HPIB" +#define DIO_ID_NHPIB 0x80 /* 98624A HP-IB (normal ie slow) */ +#define DIO_DESC_NHPIB "98624A HPIB" +#define DIO_ID_IHPIB 0x00 /* internal HPIB (not its real ID, it hasn't got one! */ +#define DIO_DESC_IHPIB "internal HPIB" +#define DIO_ID_SCSI0 0x07 /* 98625A SCSI */ +#define DIO_DESC_SCSI0 "98625A SCSI0" +#define DIO_ID_SCSI1 0x27 /* ditto */ +#define DIO_DESC_SCSI1 "98625A SCSI1" +#define DIO_ID_SCSI2 0x47 /* ditto */ +#define DIO_DESC_SCSI2 "98625A SCSI2" +#define DIO_ID_SCSI3 0x67 /* ditto */ +#define DIO_DESC_SCSI3 "98625A SCSI3" +#define DIO_ID_FBUFFER 0x39 /* framebuffer: flavour is distinguished by secondary ID */ +#define DIO_DESC_FBUFFER "bitmapped display" +/* the NetBSD kernel source is a bit unsure as to what these next IDs actually do :-> */ +#define DIO_ID_MISC0 0x03 /* 98622A */ +#define DIO_DESC_MISC0 "98622A" +#define DIO_ID_MISC1 0x04 /* 98623A */ +#define DIO_DESC_MISC1 "98623A" +#define DIO_ID_PARALLEL 0x06 /* internal parallel */ +#define DIO_DESC_PARALLEL "internal parallel" +#define DIO_ID_MISC2 0x09 /* 98287A keyboard */ +#define DIO_DESC_MISC2 "98287A keyboard" +#define DIO_ID_MISC3 0x0a /* HP98635A FP accelerator */ +#define DIO_DESC_MISC3 "HP98635A FP accelerator" +#define DIO_ID_MISC4 0x0b /* timer */ +#define DIO_DESC_MISC4 "timer" +#define DIO_ID_MISC5 0x12 /* 98640A */ +#define DIO_DESC_MISC5 "98640A" +#define DIO_ID_MISC6 0x16 /* 98659A */ +#define DIO_DESC_MISC6 "98659A" +#define DIO_ID_MISC7 0x19 /* 237 display */ +#define DIO_DESC_MISC7 "237 display" +#define DIO_ID_MISC8 0x1a /* quad-wide card */ +#define DIO_DESC_MISC8 "quad-wide card" +#define DIO_ID_MISC9 0x1b /* 98253A */ +#define DIO_DESC_MISC9 "98253A" +#define DIO_ID_MISC10 0x1c /* 98627A */ +#define DIO_DESC_MISC10 "98253A" +#define DIO_ID_MISC11 0x1d /* 98633A */ +#define DIO_DESC_MISC11 "98633A" +#define DIO_ID_MISC12 0x1e /* 98259A */ +#define DIO_DESC_MISC12 "98259A" +#define DIO_ID_MISC13 0x1f /* 8741 */ +#define DIO_DESC_MISC13 "8741" +#define DIO_ID_VME 0x31 /* 98577A VME adapter */ +#define DIO_DESC_VME "98577A VME adapter" +#define DIO_ID_DCL 0x34 /* 98628A serial */ +#define DIO_DESC_DCL "98628A DCL serial" +#define DIO_ID_DCLREM 0xb4 /* 98628A serial */ +#define DIO_DESC_DCLREM "98628A DCLREM serial" +/* These are the secondary IDs for the framebuffers */ +#define DIO_ID2_GATORBOX 0x01 /* 98700/98710 "gatorbox" */ +#define DIO_DESC2_GATORBOX "98700/98710 \"gatorbox\" display" +#define DIO_ID2_TOPCAT 0x02 /* 98544/98545/98547 "topcat" */ +#define DIO_DESC2_TOPCAT "98544/98545/98547 \"topcat\" display" +#define DIO_ID2_RENAISSANCE 0x04 /* 98720/98721 "renaissance" */ +#define DIO_DESC2_RENAISSANCE "98720/98721 \"renaissance\" display" +#define DIO_ID2_LRCATSEYE 0x05 /* lowres "catseye" */ +#define DIO_DESC2_LRCATSEYE "low-res catseye display" +#define DIO_ID2_HRCCATSEYE 0x06 /* highres colour "catseye" */ +#define DIO_DESC2_HRCCATSEYE "high-res color catseye display" +#define DIO_ID2_HRMCATSEYE 0x07 /* highres mono "catseye" */ +#define DIO_DESC2_HRMCATSEYE "high-res mono catseye display" +#define DIO_ID2_DAVINCI 0x08 /* 98730/98731 "davinci" */ +#define DIO_DESC2_DAVINCI "98730/98731 \"davinci\" display" +#define DIO_ID2_XXXCATSEYE 0x09 /* "catseye" */ +#define DIO_DESC2_XXXCATSEYE "catseye display" +#define DIO_ID2_HYPERION 0x0e /* A1096A "hyperion" */ +#define DIO_DESC2_HYPERION "A1096A \"hyperion\" display" +#define DIO_ID2_XGENESIS 0x0b /* "x-genesis"; no NetBSD support */ +#define DIO_DESC2_XGENESIS "\"x-genesis\" display" +#define DIO_ID2_TIGER 0x0c /* "tiger"; no NetBSD support */ +#define DIO_DESC2_TIGER "\"tiger\" display" +#define DIO_ID2_YGENESIS 0x0d /* "y-genesis"; no NetBSD support */ +#define DIO_DESC2_YGENESIS "\"y-genesis\" display" +/* if you add new IDs then you should tell dio.c about them so it can + * identify them... + */ + +extern void dio_init(void); +extern int dio_find(int deviceid); +extern void *dio_scodetoviraddr(int scode); +extern int dio_scodetoipl(int scode); +extern void dio_config_board(int scode); +extern void dio_unconfig_board(int scode); + + +#endif /* __KERNEL__ */ +#endif /* ndef _LINUX_DIO_H */ diff --git a/include/linux/efs_fs.h b/include/linux/efs_fs.h index b3f04b809..a1a57bdb5 100644 --- a/include/linux/efs_fs.h +++ b/include/linux/efs_fs.h @@ -6,7 +6,7 @@ * * Based on work Copyright (C) 1995, 1996 Christian Vogelgsang. * - * $Id: efs_fs.h,v 1.2 1998/05/23 17:11:25 shaver Exp $ + * $Id: efs_fs.h,v 1.1 1997/12/02 02:28:29 ralf Exp $ */ #ifndef __LINUX_EFS_FS_H @@ -87,7 +87,7 @@ union efs_extent { __u32 ex_magic:4, /* must be zero */ ex_bn:24; __u32 ex_length:8, - ex_offset:24; + ex_offset; } ex_ex; __u32 ex_bytes[2]; }; @@ -128,8 +128,6 @@ struct efs_dirblk { /* Offsets in DirItem */ #define EFS_DI_NAMELEN 4 #define EFS_DI_NAME 5 -/* XXX endian */ -#define EFS_DE_GET_INUM(de) (((de)->ud_inum.s[0] << 16) + (de)->ud_inum.s[1]) struct efs_dent { union { diff --git a/include/linux/efs_fs_i.h b/include/linux/efs_fs_i.h index 784b89201..701bce8e7 100644 --- a/include/linux/efs_fs_i.h +++ b/include/linux/efs_fs_i.h @@ -6,7 +6,7 @@ * * Based on work Copyright (C) 1995, 1996 Christian Vogelgsang. * - * $Id: efs_fs_i.h,v 1.1 1997/09/16 20:51:18 shaver Exp $ + * $Id: efs_fs_i.h,v 1.1 1997/12/02 02:28:29 ralf Exp $ */ #ifndef __LINUX_EFS_FS_I_H @@ -16,9 +16,12 @@ /* private Inode part */ struct efs_inode_info { - __u16 efs_total; - __u16 efs_current; - union efs_extent *efs_extents; + __u32 extblk; + + __u16 tot; + __u16 cur; + + union efs_extent extents[EFS_MAX_EXTENTS]; }; #endif /* __LINUX_EFS_FS_I_H */ diff --git a/include/linux/efs_fs_sb.h b/include/linux/efs_fs_sb.h index b3f887899..4c6d17f14 100644 --- a/include/linux/efs_fs_sb.h +++ b/include/linux/efs_fs_sb.h @@ -6,7 +6,7 @@ * * Based on work Copyright (C) 1995, 1996 Christian Vogelgsang. * - * $Id$ + * $Id: efs_fs_sb.h,v 1.1 1997/12/02 02:28:29 ralf Exp $ */ #ifndef __LINUX_EFS_FS_SB_H diff --git a/include/linux/elf.h b/include/linux/elf.h index 2147b403d..b6883c1c5 100644 --- a/include/linux/elf.h +++ b/include/linux/elf.h @@ -59,12 +59,15 @@ typedef __u64 Elf64_Word; #define EM_386 3 #define EM_68K 4 #define EM_88K 5 -#define EM_486 6 /* Perhaps disused */ +#define EM_486 6 /* Perhaps disused */ #define EM_860 7 -#define EM_MIPS 8 /* MIPS R3000 (officially, big-endian only) */ -#define EM_MIPS_RS4_BE 10 -#define EM_SPARC64 11 /* SPARC v9 (not official) 64-bit */ -#define EM_PARISC 15 +#define EM_MIPS 8 /* MIPS R3000 (officially, big-endian only) */ +#define EM_MIPS_RS4_BE 10 /* MIPS R4000 big-endian */ +#define EM_PARISC 15 /* HPPA */ +#define EM_SPARC32PLUS 18 /* Sun's "v8plus" */ +#define EM_PPC 20 /* PowerPC */ +#define EM_SPARCV9 43 /* SPARC v9 64-bit */ + /* * This is an interim value that we will use until the committee comes @@ -151,8 +154,8 @@ typedef __u64 Elf64_Word; #define AT_EUID 12 /* effective uid */ #define AT_GID 13 /* real gid */ #define AT_EGID 14 /* effective gid */ -#define AT_PLATFORM 15 /* string identifying cpu for optimizations */ -#define AT_HWCAP 16 /* arch dependent hints at cpu capabilities */ +#define AT_PLATFORM 15 /* string identifying CPU for optimizations */ +#define AT_HWCAP 16 /* arch dependent hints at CPU capabilities */ typedef struct dynamic{ Elf32_Sword d_tag; @@ -279,10 +282,11 @@ typedef struct { /* Bits present in AT_HWCAP, primarily for Sparc32. */ -#define HWCAP_SPARC_FLUSH 1 /* The cpu supports flush insn. */ +#define HWCAP_SPARC_FLUSH 1 /* CPU supports flush instruction. */ #define HWCAP_SPARC_STBAR 2 #define HWCAP_SPARC_SWAP 4 #define HWCAP_SPARC_MULDIV 8 +#define HWCAP_SPARC_V9 16 /* diff --git a/include/linux/fb.h b/include/linux/fb.h index 60b6b7727..7c631b44a 100644 --- a/include/linux/fb.h +++ b/include/linux/fb.h @@ -30,6 +30,11 @@ #define FB_TYPE_PACKED_PIXELS 0 /* Packed Pixels */ #define FB_TYPE_PLANES 1 /* Non interleaved planes */ #define FB_TYPE_INTERLEAVED_PLANES 2 /* Interleaved planes */ +#define FB_TYPE_TEXT 3 /* Text/attributes */ + +#define FB_AUX_TEXT_MDA 0 /* Monochrome text */ +#define FB_AUX_TEXT_CGA 1 /* CGA/EGA/VGA Color text */ +#define FB_AUX_TEXT_S3_MMIO 2 /* S3 MMIO fasttext */ #define FB_VISUAL_MONO01 0 /* Monochr. 1=Black 0=White */ #define FB_VISUAL_MONO10 1 /* Monochr. 1=White 0=Black */ @@ -37,11 +42,26 @@ #define FB_VISUAL_PSEUDOCOLOR 3 /* Pseudo color (like atari) */ #define FB_VISUAL_DIRECTCOLOR 4 /* Direct color */ #define FB_VISUAL_STATIC_PSEUDOCOLOR 5 /* Pseudo color readonly */ -#define FB_VISUAL_STATIC_DIRECTCOLOR 6 /* Direct color readonly */ + +#define FB_ACCEL_NONE 0 /* no hardware accelerator */ +#define FB_ACCEL_ATARIBLITT 1 /* Atari Blitter */ +#define FB_ACCEL_AMIGABLITT 2 /* Amiga Blitter */ +#define FB_ACCEL_S3_TRIO64 3 /* Cybervision64 (S3 Trio64) */ +#define FB_ACCEL_NCR_77C32BLT 4 /* RetinaZ3 (NCR 77C32BLT) */ +#define FB_ACCEL_S3_VIRGE 5 /* Cybervision64/3D (S3 ViRGE) */ +#define FB_ACCEL_ATI_MACH64GX 6 /* ATI Mach 64GX family */ +#define FB_ACCEL_DEC_TGA 7 /* DEC 21030 TGA */ +#define FB_ACCEL_ATI_MACH64CT 8 /* ATI Mach 64CT family */ +#define FB_ACCEL_ATI_MACH64VT 9 /* ATI Mach 64CT family VT class */ +#define FB_ACCEL_ATI_MACH64GT 10 /* ATI Mach 64CT family GT class */ +#define FB_ACCEL_SUN_CREATOR 11 /* Sun Creator/Creator3D */ +#define FB_ACCEL_SUN_CGSIX 12 /* Sun cg6 */ +#define FB_ACCEL_SUN_LEO 13 /* Sun leo/zx */ struct fb_fix_screeninfo { char id[16]; /* identification string eg "TT Builtin" */ char *smem_start; /* Start of frame buffer mem */ + /* (physical address) */ __u32 smem_len; /* Length of frame buffer mem */ __u32 type; /* see FB_TYPE_* */ __u32 type_aux; /* Interleave for interleaved Planes */ @@ -50,12 +70,19 @@ struct fb_fix_screeninfo { __u16 ypanstep; /* zero if no hardware panning */ __u16 ywrapstep; /* zero if no hardware ywrap */ __u32 line_length; /* length of a line in bytes */ - unsigned char *mmio_start; /* Start of Memory Mapped I/O */ + char *mmio_start; /* Start of Memory Mapped I/O */ + /* (physical address) */ __u32 mmio_len; /* Length of Memory Mapped I/O */ __u32 accel; /* Type of acceleration available */ __u16 reserved[3]; /* Reserved for future compatibility */ }; +/* Interpretation of offset for color fields: All offsets are from the right, + * inside a "pixel" value, which is exactly 'bits_per_pixel' wide (means: you + * can use the offset as right argument to <<). A pixel afterwards is a bit + * stream and is written to video memory as that unmodified. This implies + * big-endian byte order if bits_per_pixel is greater than 8. + */ struct fb_bitfield { __u32 offset; /* beginning of bitfield */ __u32 length; /* length of bitfield */ @@ -73,15 +100,7 @@ struct fb_bitfield { #define FB_ACTIVATE_VBL 16 /* activate values on next vbl */ #define FB_CHANGE_CMAP_VBL 32 /* change colormap on vbl */ -#define FB_ACCEL_NONE 0 /* no hardware accelerator */ -#define FB_ACCEL_ATARIBLITT 1 /* Atari Blitter */ -#define FB_ACCEL_AMIGABLITT 2 /* Amiga Blitter */ -#define FB_ACCEL_S3TRIO64 3 /* Cybervision64 (S3 Trio64) */ -#define FB_ACCEL_NCR77C32BLT 4 /* RetinaZ3 (NCR77C32BLT) */ -#define FB_ACCEL_S3VIRGE 5 /* Cybervision64/3D (S3 ViRGE) */ -#define FB_ACCEL_MACH64 6 /* ATI Mach 64 */ -#define FB_ACCEL_TGA 7 /* DEC 21030 TGA */ -#define FB_ACCEL_ATY 8 /* atyfb (ATI Mach64) */ +#define FB_ACCELF_TEXT 1 /* text mode acceleration */ #define FB_SYNC_HOR_HIGH_ACT 1 /* horizontal sync high active */ #define FB_SYNC_VERT_HIGH_ACT 2 /* vertical sync high active */ @@ -124,7 +143,7 @@ struct fb_var_screeninfo { __u32 height; /* height of picture in mm */ __u32 width; /* width of picture in mm */ - __u32 accel; /* see FB_ACCEL_* */ + __u32 accel_flags; /* acceleration flags (hints) */ /* Timing: All values in pixclocks, except pixclock (of course) */ __u32 pixclock; /* pixel clock in ps (pico seconds) */ @@ -154,10 +173,10 @@ struct fb_con2fbmap { }; struct fb_monspecs { - unsigned hfmin : 20; /* hfreq lower limit (Hz) */ - unsigned hfmax : 20; /* hfreq upper limit (Hz) */ - unsigned vfmin : 10; /* vfreq lower limit (Hz) */ - unsigned vfmax : 10; /* vfreq upper limit (Hz) */ + __u32 hfmin; /* hfreq lower limit (Hz) */ + __u32 hfmax; /* hfreq upper limit (Hz) */ + __u16 vfmin; /* vfreq lower limit (Hz) */ + __u16 vfmax; /* vfreq upper limit (Hz) */ unsigned dpms : 1; /* supports DPMS */ }; @@ -168,7 +187,8 @@ struct fb_monspecs { struct fb_info; struct fb_info_gen; - +struct vm_area_struct; +struct file; /* * Frame buffer operations @@ -176,8 +196,8 @@ struct fb_info_gen; struct fb_ops { /* open/release and usage marking */ - int (*fb_open)(struct fb_info *info); - int (*fb_release)(struct fb_info *info); + int (*fb_open)(struct fb_info *info, int user); + int (*fb_release)(struct fb_info *info, int user); /* get non settable parameters */ int (*fb_get_fix)(struct fb_fix_screeninfo *fix, int con, struct fb_info *info); @@ -196,11 +216,11 @@ struct fb_ops { /* pan display */ int (*fb_pan_display)(struct fb_var_screeninfo *var, int con, struct fb_info *info); - /* switch between text and graphics mode */ - int (*fb_set_mode)(int mode, struct fb_info *info); /* perform fb specific ioctl */ int (*fb_ioctl)(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg, int con, struct fb_info *info); + /* perform fb specific mmap */ + int (*fb_mmap)(struct fb_info *info, struct file *file, struct vm_area_struct *vma); }; @@ -216,6 +236,7 @@ struct display { /* are updated by fbcon.c */ struct fb_cmap cmap; /* colormap */ char *screen_base; /* pointer to top of virtual screen */ + /* (virtual address) */ int visual; int type; /* see FB_TYPE_* */ int type_aux; /* Interleave for interleaved Planes */ @@ -236,20 +257,24 @@ struct display { struct vc_data *conp; /* pointer to console data */ struct fb_info *fb_info; /* frame buffer for this console */ int vrows; /* number of virtual rows */ - int cursor_x; /* current cursor position */ - int cursor_y; + unsigned short cursor_x; /* current cursor position */ + unsigned short cursor_y; int fgcol; /* text colors */ int bgcol; u_long next_line; /* offset to one line below */ u_long next_plane; /* offset to next plane */ u_char *fontdata; /* Font associated to this display */ - int fontheight; - int fontwidth; + unsigned short fontheightlog; + unsigned short fontwidthlog; + unsigned short fontheight; + unsigned short fontwidth; int userfont; /* != 0 if fontdata kmalloc()ed */ struct display_switch *dispsw; /* low level operations */ u_short scrollmode; /* Scroll Method */ short yscroll; /* Hardware scrolling */ -}; + unsigned char fgshift, bgshift; + unsigned short charmask; /* 0xff or 0x1ff */ +}; struct fb_info { @@ -258,6 +283,7 @@ struct fb_info { struct fb_ops *fbops; struct fb_monspecs monspecs; struct display *disp; /* initial display variable */ + struct vc_data *display_fg; /* Console visible on this display */ char fontname[40]; /* default font name */ int (*changevar)(int); /* tell console var has changed */ int (*switch_con)(int, struct fb_info*); @@ -265,6 +291,8 @@ struct fb_info { int (*updatevar)(int, struct fb_info*); /* tell fb to update the vars */ void (*blank)(int, struct fb_info*); /* tell fb to (un)blank the screen */ + /* arg = 0: unblank */ + /* arg > 0: VESA level (arg-1) */ /* From here on everything is device dependent */ }; @@ -308,6 +336,38 @@ struct fb_info_gen { /* From here on everything is device dependent */ }; + /* + * `Generic' versions of the frame buffer device operations + */ + +extern int fbgen_get_fix(struct fb_fix_screeninfo *fix, int con, + struct fb_info *info); +extern int fbgen_get_var(struct fb_var_screeninfo *var, int con, + struct fb_info *info); +extern int fbgen_set_var(struct fb_var_screeninfo *var, int con, + struct fb_info *info); +extern int fbgen_get_cmap(struct fb_cmap *cmap, int kspc, int con, + struct fb_info *info); +extern int fbgen_set_cmap(struct fb_cmap *cmap, int kspc, int con, + struct fb_info *info); +extern int fbgen_pan_display(struct fb_var_screeninfo *var, int con, + struct fb_info *info); +extern int fbgen_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, unsigned long arg, int con, + struct fb_info *info); + + /* + * Helper functions + */ + +extern int fbgen_do_set_var(struct fb_var_screeninfo *var, int isactive, + struct fb_info_gen *info); +extern void fbgen_set_disp(int con, struct fb_info_gen *info); +extern void fbgen_install_cmap(int con, struct fb_info_gen *info); +extern int fbgen_update_var(int con, struct fb_info *info); +extern int fbgen_switch(int con, struct fb_info *info); +extern void fbgen_blank(int blank, struct fb_info *info); + struct fb_videomode { const char *name; @@ -315,13 +375,9 @@ struct fb_videomode { }; -/* prototypes */ -typedef unsigned long fb_init_func(unsigned long); - /* drivers/char/fbmem.c */ extern int register_framebuffer(struct fb_info *fb_info); extern int unregister_framebuffer(const struct fb_info *fb_info); -extern unsigned long probe_framebuffers(unsigned long kmem_start); extern int fbmon_valid_timings(u_int pixclock, u_int htotal, u_int vtotal, const struct fb_info *fb_info); extern int fbmon_dpms(const struct fb_info *fb_info); @@ -350,6 +406,12 @@ extern int fb_set_cmap(struct fb_cmap *cmap, struct fb_var_screeninfo *var, extern struct fb_cmap *fb_default_cmap(int len); extern void fb_invert_cmaps(void); +/* VESA Blanking Levels */ +#define VESA_NO_BLANKING 0 +#define VESA_VSYNC_SUSPEND 1 +#define VESA_HSYNC_SUSPEND 2 +#define VESA_POWERDOWN 3 + #endif /* __KERNEL__ */ #if 1 diff --git a/include/linux/fd.h b/include/linux/fd.h index 627a9d2bd..dc8439540 100644 --- a/include/linux/fd.h +++ b/include/linux/fd.h @@ -116,7 +116,7 @@ typedef char floppy_drive_name[16]; * Drive parameters (user modifiable) */ struct floppy_drive_params { - signed char cmos; /* cmos type */ + signed char cmos; /* CMOS type */ /* Spec2 is (HLD<<1 | ND), where HLD is head load time (1=2ms, 2=4 ms * etc) and ND is set means no DMA. Hardcoded to 6 (HLD=6ms, use DMA). @@ -189,7 +189,7 @@ enum { * Current drive state (not directly modifiable by user, readonly) */ struct floppy_drive_struct { - signed char flags; + unsigned long flags; /* values for these flags */ #define FD_NEED_TWADDLE (1 << FD_NEED_TWADDLE_BIT) #define FD_VERIFY (1 << FD_VERIFY_BIT) diff --git a/include/linux/fs.h b/include/linux/fs.h index 026d3209e..69fa35c3c 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -21,7 +21,9 @@ #include <asm/atomic.h> #include <asm/bitops.h> +#include <asm/cache.h> +struct poll_table_struct; /* @@ -38,13 +40,13 @@ #define NR_OPEN 1024 #define NR_SUPER 64 -#define BLOCK_SIZE 1024 #define BLOCK_SIZE_BITS 10 +#define BLOCK_SIZE (1<<BLOCK_SIZE_BITS) /* And dynamically-tunable limits and defaults: */ extern int max_inodes; extern int max_files, nr_files, nr_free_files; -#define NR_INODE 4096 /* This should no longer be bigger than NR_FILE */ + #define NR_FILE 4096 /* this can well be larger on a larger system */ #define NR_RESERVED_FILES 10 /* reserved for root */ @@ -87,7 +89,7 @@ extern int max_files, nr_files, nr_free_files; #define MS_SYNCHRONOUS 16 /* Writes are synced at once */ #define MS_REMOUNT 32 /* Alter flags of a mounted FS */ #define MS_MANDLOCK 64 /* Allow mandatory locks on an FS */ -#define S_WRITE 128 /* Write on file/directory/symlink */ +#define S_QUOTA 128 /* Quota initialized for file/directory/symlink */ #define S_APPEND 256 /* Append-only file */ #define S_IMMUTABLE 512 /* Immutable file */ #define MS_NOATIME 1024 /* Do not update access times. */ @@ -119,7 +121,7 @@ extern int max_files, nr_files, nr_free_files; #define IS_SYNC(inode) ((inode)->i_flags & MS_SYNCHRONOUS) #define IS_MANDLOCK(inode) ((inode)->i_flags & MS_MANDLOCK) -#define IS_WRITABLE(inode) ((inode)->i_flags & S_WRITE) +#define IS_QUOTAINIT(inode) ((inode)->i_flags & S_QUOTA) #define IS_APPEND(inode) ((inode)->i_flags & S_APPEND) #define IS_IMMUTABLE(inode) ((inode)->i_flags & S_IMMUTABLE) #define IS_NOATIME(inode) ((inode)->i_flags & MS_NOATIME) @@ -317,7 +319,11 @@ struct iattr { #define ATTR_FLAG_IMMUTABLE 8 /* Immutable file */ #define ATTR_FLAG_NODIRATIME 16 /* Don't update atime for directory */ +/* + * Includes for diskquotas and mount structures. + */ #include <linux/quota.h> +#include <linux/mount.h> struct inode { struct list_head i_hash; @@ -631,16 +637,17 @@ struct super_operations { int (*statfs) (struct super_block *, struct statfs *, int); int (*remount_fs) (struct super_block *, int *, char *); void (*clear_inode) (struct inode *); + void (*umount_begin) (struct super_block *); }; struct dquot_operations { void (*initialize) (struct inode *, short); void (*drop) (struct inode *); - int (*alloc_block) (const struct inode *, unsigned long); - int (*alloc_inode) (const struct inode *, unsigned long); + int (*alloc_block) (const struct inode *, unsigned long, uid_t, char); + int (*alloc_inode) (const struct inode *, unsigned long, uid_t); void (*free_block) (const struct inode *, unsigned long); void (*free_inode) (const struct inode *, unsigned long); - int (*transfer) (struct inode *, struct iattr *, char); + int (*transfer) (struct inode *, struct iattr *, char, uid_t); }; struct file_system_type { diff --git a/include/linux/genhd.h b/include/linux/genhd.h index c8f38cfde..868f490cb 100644 --- a/include/linux/genhd.h +++ b/include/linux/genhd.h @@ -30,6 +30,7 @@ #define DOS_EXTENDED_PARTITION 5 #define LINUX_EXTENDED_PARTITION 0x85 #define WIN98_EXTENDED_PARTITION 0x0f + #define LINUX_SWAP_PARTITION 0x82 #ifdef CONFIG_SOLARIS_X86_PARTITION diff --git a/include/linux/hayesesp.h b/include/linux/hayesesp.h new file mode 100644 index 000000000..2ed3903af --- /dev/null +++ b/include/linux/hayesesp.h @@ -0,0 +1,127 @@ +#ifndef HAYESESP_H +#define HAYESESP_H + +struct hayes_esp_config { + short flow_on; + short flow_off; + short rx_trigger; + short tx_trigger; + short pio_threshold; + unsigned char rx_timeout; + char dma_channel; +}; + +#ifdef __KERNEL__ + +#define ESP_DMA_CHANNEL 0 +#define ESP_RX_TRIGGER 768 +#define ESP_TX_TRIGGER 768 +#define ESP_FLOW_OFF 1016 +#define ESP_FLOW_ON 944 +#define ESP_RX_TMOUT 128 +#define ESP_PIO_THRESHOLD 32 + +#define ESP_IN_MAJOR 57 /* major dev # for dial in */ +#define ESP_OUT_MAJOR 58 /* major dev # for dial out */ +#define ESPC_SCALE 3 +#define UART_ESI_BASE 0x00 +#define UART_ESI_SID 0x01 +#define UART_ESI_RX 0x02 +#define UART_ESI_TX 0x02 +#define UART_ESI_CMD1 0x04 +#define UART_ESI_CMD2 0x05 +#define UART_ESI_STAT1 0x04 +#define UART_ESI_STAT2 0x05 +#define UART_ESI_RWS 0x07 + +#define UART_IER_DMA_TMOUT 0x80 +#define UART_IER_DMA_TC 0x08 + +#define ESI_SET_IRQ 0x04 +#define ESI_SET_DMA_TMOUT 0x05 +#define ESI_SET_SRV_MASK 0x06 +#define ESI_SET_ERR_MASK 0x07 +#define ESI_SET_FLOW_CNTL 0x08 +#define ESI_SET_FLOW_CHARS 0x09 +#define ESI_SET_FLOW_LVL 0x0a +#define ESI_SET_TRIGGER 0x0b +#define ESI_SET_RX_TIMEOUT 0x0c +#define ESI_SET_FLOW_TMOUT 0x0d +#define ESI_WRITE_UART 0x0e +#define ESI_READ_UART 0x0f +#define ESI_SET_MODE 0x10 +#define ESI_GET_ERR_STAT 0x12 +#define ESI_GET_UART_STAT 0x13 +#define ESI_GET_RX_AVAIL 0x14 +#define ESI_GET_TX_AVAIL 0x15 +#define ESI_START_DMA_RX 0x16 +#define ESI_START_DMA_TX 0x17 +#define ESI_ISSUE_BREAK 0x1a +#define ESI_FLUSH_RX 0x1b +#define ESI_FLUSH_TX 0x1c +#define ESI_SET_BAUD 0x1d +#define ESI_SET_ENH_IRQ 0x1f +#define ESI_SET_REINTR 0x20 +#define ESI_SET_PRESCALAR 0x23 +#define ESI_NO_COMMAND 0xff + +#define ESP_STAT_RX_TIMEOUT 0x01 +#define ESP_STAT_DMA_RX 0x02 +#define ESP_STAT_DMA_TX 0x04 +#define ESP_STAT_NEVER_DMA 0x08 +#define ESP_STAT_USE_PIO 0x10 + +#define ESP_EVENT_WRITE_WAKEUP 0 +#define ESP_MAGIC 0x53ee +#define ESP_XMIT_SIZE 4096 + +struct esp_struct { + int magic; + int port; + int irq; + int flags; /* defined in tty.h */ + struct tty_struct *tty; + int read_status_mask; + int ignore_status_mask; + int timeout; + int stat_flags; + int custom_divisor; + int close_delay; + unsigned short closing_wait; + unsigned short closing_wait2; + int IER; /* Interrupt Enable Register */ + int MCR; /* Modem control register */ + unsigned long event; + unsigned long last_active; + int line; + int count; /* # of fd on device */ + int blocked_open; /* # of blocked opens */ + long session; /* Session of opening process */ + long pgrp; /* pgrp of opening process */ + unsigned char *xmit_buf; + int xmit_head; + int xmit_tail; + int xmit_cnt; + struct tq_struct tqueue; + struct tq_struct tqueue_hangup; + struct termios normal_termios; + struct termios callout_termios; + struct wait_queue *open_wait; + struct wait_queue *close_wait; + struct wait_queue *delta_msr_wait; + struct wait_queue *break_wait; + struct async_icount icount; /* kernel counters for the 4 input interrupts */ + struct hayes_esp_config config; /* port configuration */ + struct esp_struct *next_port; /* For the linked list */ +}; + +struct esp_pio_buffer { + unsigned char data[1024]; + struct esp_pio_buffer *next; +}; + +#endif /* __KERNEL__ */ + + +#endif /* ESP_H */ + diff --git a/include/linux/hdlcdrv.h b/include/linux/hdlcdrv.h index d7d4609cb..11cd8c6a0 100644 --- a/include/linux/hdlcdrv.h +++ b/include/linux/hdlcdrv.h @@ -106,6 +106,7 @@ struct hdlcdrv_ioctl { #include <linux/netdevice.h> #include <linux/if.h> +#include <asm/spinlock.h> #define HDLCDRV_MAGIC 0x5ac6e778 #define HDLCDRV_IFNAMELEN 6 @@ -119,6 +120,7 @@ struct hdlcdrv_ioctl { struct hdlcdrv_hdlcbuffer { + spinlock_t lock; unsigned rd, wr; unsigned short buf[HDLCDRV_HDLCBUFFER]; }; @@ -256,33 +258,45 @@ struct hdlcdrv_state { extern inline int hdlcdrv_hbuf_full(struct hdlcdrv_hdlcbuffer *hb) { - return !((HDLCDRV_HDLCBUFFER - 1 + hb->rd - hb->wr) - % HDLCDRV_HDLCBUFFER); + unsigned long flags; + int ret; + + spin_lock_irqsave(&hb->lock, flags); + ret = !((HDLCDRV_HDLCBUFFER - 1 + hb->rd - hb->wr) % HDLCDRV_HDLCBUFFER); + spin_unlock_irqrestore(&hb->lock, flags); + return ret; } /* -------------------------------------------------------------------- */ extern inline int hdlcdrv_hbuf_empty(struct hdlcdrv_hdlcbuffer *hb) { - return hb->rd == hb->wr; + unsigned long flags; + int ret; + + spin_lock_irqsave(&hb->lock, flags); + ret = (hb->rd == hb->wr); + spin_unlock_irqrestore(&hb->lock, flags); + return ret; } /* -------------------------------------------------------------------- */ extern inline unsigned short hdlcdrv_hbuf_get(struct hdlcdrv_hdlcbuffer *hb) { - unsigned newr; - unsigned short val; unsigned long flags; + unsigned short val; + unsigned newr; + spin_lock_irqsave(&hb->lock, flags); if (hb->rd == hb->wr) - return 0; - save_flags(flags); - cli(); - newr = (hb->rd+1) % HDLCDRV_HDLCBUFFER; - val = hb->buf[hb->rd]; - hb->rd = newr; - restore_flags(flags); + val = 0; + else { + newr = (hb->rd+1) % HDLCDRV_HDLCBUFFER; + val = hb->buf[hb->rd]; + hb->rd = newr; + } + spin_unlock_irqrestore(&hb->lock, flags); return val; } @@ -293,15 +307,14 @@ extern inline void hdlcdrv_hbuf_put(struct hdlcdrv_hdlcbuffer *hb, { unsigned newp; unsigned long flags; - - save_flags(flags); - cli(); + + spin_lock_irqsave(&hb->lock, flags); newp = (hb->wr+1) % HDLCDRV_HDLCBUFFER; if (newp != hb->rd) { hb->buf[hb->wr] = val & 0xffff; hb->wr = newp; } - restore_flags(flags); + spin_unlock_irqrestore(&hb->lock, flags); } /* -------------------------------------------------------------------- */ diff --git a/include/linux/hippidevice.h b/include/linux/hippidevice.h new file mode 100644 index 000000000..467798a19 --- /dev/null +++ b/include/linux/hippidevice.h @@ -0,0 +1,56 @@ +/* + * INET An implementation of the TCP/IP protocol suite for the LINUX + * operating system. INET is implemented using the BSD Socket + * interface as the means of communication with the user level. + * + * Definitions for the HIPPI handlers. + * + * Version: @(#)hippidevice.h 1.0.0 05/26/97 + * + * Author: Jes Sorensen, <Jes.Sorensen@cern.ch> + * + * hippidevice.h is based on previous fddidevice.h work by + * Ross Biro, <bir7@leland.Stanford.Edu> + * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG> + * Alan Cox, <gw4pts@gw4pts.ampr.org> + * Lawrence V. Stefani, <stefani@lkg.dec.com> + * + * 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. + */ +#ifndef _LINUX_HIPPIDEVICE_H +#define _LINUX_HIPPIDEVICE_H + +#include <linux/if_hippi.h> + +#ifdef __KERNEL__ +extern int hippi_header(struct sk_buff *skb, + struct device *dev, + unsigned short type, + void *daddr, + void *saddr, + unsigned len); + +extern int hippi_rebuild_header(struct sk_buff *skb); + +extern unsigned short hippi_type_trans(struct sk_buff *skb, + struct device *dev); + +extern void hippi_header_cache_bind(struct hh_cache ** hhp, + struct device *dev, + unsigned short htype, + __u32 daddr); + +extern void hippi_header_cache_update(struct hh_cache *hh, + struct device *dev, + unsigned char * haddr); +extern int hippi_header_parse(struct sk_buff *skb, unsigned char *haddr); + +extern void hippi_net_init(void); + +extern struct device *init_hippi_dev(struct device *, int); +#endif + +#endif /* _LINUX_HIPPIDEVICE_H */ diff --git a/include/linux/i2c.h b/include/linux/i2c.h new file mode 100644 index 000000000..44c09570d --- /dev/null +++ b/include/linux/i2c.h @@ -0,0 +1,166 @@ +#ifndef I2C_H +#define I2C_H + +/* + * linux i2c interface. Works a little bit like the scsi subsystem. + * There are: + * + * i2c the basic control module (like scsi_mod) + * bus driver a driver with a i2c bus (host adapter driver) + * chip driver a driver for a chip connected + * to a i2c bus (cdrom/hd driver) + * + * A device will be attached to one bus and one chip driver. Every chip + * driver gets a unique ID. + * + * A chip driver can provide a ioctl-like callback for the + * communication with other parts of the kernel (not every i2c chip is + * useful without other devices, a TV card tuner for example). + * + * "i2c internal" parts of the structs: only the i2c module is allowed to + * write to them, for others they are read-only. + * + */ + +#define I2C_BUS_MAX 4 /* max # of bus drivers */ +#define I2C_DRIVER_MAX 8 /* max # of chip drivers */ +#define I2C_DEVICE_MAX 8 /* max # if devices per bus/driver */ + +struct i2c_bus; +struct i2c_driver; +struct i2c_device; + +#define I2C_DRIVERID_MSP3400 1 +#define I2C_DRIVERID_TUNER 2 +#define I2C_DRIVERID_VIDEOTEXT 3 + +#define I2C_BUSID_BT848 1 /* I2C bus on a BT848 */ + +/* + * struct for a driver for a i2c chip (tuner, soundprocessor, + * videotext, ... ). + * + * a driver will register within the i2c module. The i2c module will + * callback the driver (i2c_attach) for every device it finds on a i2c + * bus at the specified address. If the driver decides to "accept" + * the, device, it must return a struct i2c_device, and NULL + * otherwise. + * + * i2c_detach = i2c_attach ** -1 + * + * i2c_command will be used to pass commands to the driver in a + * ioctl-line manner. + * + */ + +struct i2c_driver +{ + char name[32]; /* some useful label */ + int id; /* device type ID */ + unsigned char addr_l, addr_h; /* address range of the chip */ + + int (*attach)(struct i2c_device *device); + int (*detach)(struct i2c_device *device); + int (*command)(struct i2c_device *device,unsigned int cmd, void *arg); + + /* i2c internal */ + struct i2c_device *devices[I2C_DEVICE_MAX]; + int devcount; +}; + + +/* + * this holds the informations about a i2c bus available in the system. + * + * a chip with a i2c bus interface (like bt848) registers the bus within + * the i2c module. This struct provides functions to access the i2c bus. + * + * One must hold the spinlock to access the i2c bus (XXX: is the irqsave + * required? Maybe better use a semaphore?). + * [-AC-] having a spinlock_irqsave is only needed if we have drivers wishing + * to bang their i2c bus from an interrupt. + * + * attach/detach_inform is a callback to inform the bus driver about + * attached chip drivers. + * + */ + +/* needed: unsigned long flags */ + +#define LOCK_I2C_BUS(bus) spin_lock_irqsave(&(bus->bus_lock),flags); +#define UNLOCK_I2C_BUS(bus) spin_unlock_irqrestore(&(bus->bus_lock),flags); + +struct i2c_bus +{ + char name[32]; /* some useful label */ + int id; + void *data; /* free for use by the bus driver */ + + spinlock_t bus_lock; + + /* attach/detach inform callbacks */ + void (*attach_inform)(struct i2c_bus *bus, int id); + void (*detach_inform)(struct i2c_bus *bus, int id); + + /* Software I2C */ + void (*i2c_setlines)(struct i2c_bus *bus, int ctrl, int data); + int (*i2c_getdataline)(struct i2c_bus *bus); + + /* Hardware I2C */ + int (*i2c_read)(struct i2c_bus *bus, unsigned char addr); + int (*i2c_write)(struct i2c_bus *bus, unsigned char addr, + unsigned char b1, unsigned char b2, int both); + + /* internal data for i2c module */ + struct i2c_device *devices[I2C_DEVICE_MAX]; + int devcount; +}; + + +/* + * This holds per-device data for a i2c device + */ + +struct i2c_device +{ + char name[32]; /* some useful label */ + void *data; /* free for use by the chip driver */ + unsigned char addr; /* chip addr */ + + /* i2c internal */ + struct i2c_bus *bus; + struct i2c_driver *driver; +}; + + +/* ------------------------------------------------------------------- */ +/* i2c module functions */ + +/* register/unregister a i2c bus */ +int i2c_register_bus(struct i2c_bus *bus); +int i2c_unregister_bus(struct i2c_bus *bus); + +/* register/unregister a chip driver */ +int i2c_register_driver(struct i2c_driver *driver); +int i2c_unregister_driver(struct i2c_driver *driver); + +/* send a command to a chip using the ioctl-like callback interface */ +int i2c_control_device(struct i2c_bus *bus, int id, + unsigned int cmd, void *arg); + +/* i2c bus access functions */ +void i2c_start(struct i2c_bus *bus); +void i2c_stop(struct i2c_bus *bus); +void i2c_one(struct i2c_bus *bus); +void i2c_zero(struct i2c_bus *bus); +int i2c_ack(struct i2c_bus *bus); + +int i2c_sendbyte(struct i2c_bus *bus,unsigned char data,int wait_for_ack); +unsigned char i2c_readbyte(struct i2c_bus *bus,int last); + +/* i2c (maybe) hardware functions */ +int i2c_read(struct i2c_bus *bus, unsigned char addr); +int i2c_write(struct i2c_bus *bus, unsigned char addr, + unsigned char b1, unsigned char b2, int both); + +#endif /* I2C_H */ diff --git a/include/linux/if_ether.h b/include/linux/if_ether.h index 213251b23..68213c539 100644 --- a/include/linux/if_ether.h +++ b/include/linux/if_ether.h @@ -72,6 +72,7 @@ #define ETH_P_LOCALTALK 0x0009 /* Localtalk pseudo type */ #define ETH_P_PPPTALK 0x0010 /* Dummy type for Atalk over PPP*/ #define ETH_P_TR_802_2 0x0011 /* 802.2 frames */ +#define ETH_P_MOBITEX 0x0015 /* Mobitex (kaz@cafe.net) */ /* * This is an Ethernet frame header. diff --git a/include/linux/if_fddi.h b/include/linux/if_fddi.h index 6db6745b6..30bde75d9 100644 --- a/include/linux/if_fddi.h +++ b/include/linux/if_fddi.h @@ -107,6 +107,8 @@ struct fddi_statistics { __u32 rx_packets; /* total packets received */ __u32 tx_packets; /* total packets transmitted */ + __u32 rx_bytes; /* total bytes received */ + __u32 tx_bytes; /* total bytes transmitted */ __u32 rx_errors; /* bad packets received */ __u32 tx_errors; /* packet transmit problems */ __u32 rx_dropped; /* no space in linux buffers */ @@ -114,6 +116,25 @@ struct fddi_statistics __u32 multicast; /* multicast packets received */ __u32 transmit_collision; /* always 0 for FDDI */ + /* detailed rx_errors */ + __u32 rx_length_errors; + __u32 rx_over_errors; /* receiver ring buff overflow */ + __u32 rx_crc_errors; /* recved pkt with crc error */ + __u32 rx_frame_errors; /* recv'd frame alignment error */ + __u32 rx_fifo_errors; /* recv'r fifo overrun */ + __u32 rx_missed_errors; /* receiver missed packet */ + + /* detailed tx_errors */ + __u32 tx_aborted_errors; + __u32 tx_carrier_errors; + __u32 tx_fifo_errors; + __u32 tx_heartbeat_errors; + __u32 tx_window_errors; + + /* for cslip etc */ + __u32 rx_compressed; + __u32 tx_compressed; + /* Detailed FDDI statistics. Adopted from RFC 1512 */ __u8 smt_station_id[8]; diff --git a/include/linux/if_hippi.h b/include/linux/if_hippi.h new file mode 100644 index 000000000..4ed065939 --- /dev/null +++ b/include/linux/if_hippi.h @@ -0,0 +1,157 @@ +/* + * INET An implementation of the TCP/IP protocol suite for the LINUX + * operating system. INET is implemented using the BSD Socket + * interface as the means of communication with the user level. + * + * Global definitions for the HIPPI interface. + * + * Version: @(#)if_hippi.h 1.0.0 05/26/97 + * + * Author: Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG> + * Donald Becker, <becker@super.org> + * Alan Cox, <alan@cymru.net> + * Steve Whitehouse, <gw7rrm@eeshack3.swan.ac.uk> + * Jes Sorensen, <Jes.Sorensen@cern.ch> + * + * 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. + */ + +#ifndef _LINUX_IF_HIPPI_H +#define _LINUX_IF_HIPPI_H + +#include <asm/byteorder.h> + +/* + * HIPPI magic constants. + */ + +#define HIPPI_ALEN 6 /* Bytes in one HIPPI hw-addr */ +#define HIPPI_HLEN sizeof(struct hippi_hdr) +#define HIPPI_ZLEN 0 /* Min. bytes in frame without FCS */ +#define HIPPI_DATA_LEN 65280 /* Max. bytes in payload */ +#define HIPPI_FRAME_LEN (HIPPI_DATA_LEN + HIPPI_HLEN) + /* Max. bytes in frame without FCS */ + +/* + * Define LLC and SNAP constants. + */ +#define HIPPI_EXTENDED_SAP 0xAA +#define HIPPI_UI_CMD 0x03 + + +/* + * Do we need to list some sort of ID's here? + */ + +/* + * HIPPI statistics collection data. + */ + +struct hipnet_statistics +{ + int rx_packets; /* total packets received */ + int tx_packets; /* total packets transmitted */ + int rx_errors; /* bad packets received */ + int tx_errors; /* packet transmit problems */ + int rx_dropped; /* no space in linux buffers */ + int tx_dropped; /* no space available in linux */ + + /* detailed rx_errors: */ + int rx_length_errors; + int rx_over_errors; /* receiver ring buff overflow */ + int rx_crc_errors; /* recved pkt with crc error */ + int rx_frame_errors; /* recv'd frame alignment error */ + int rx_fifo_errors; /* recv'r fifo overrun */ + int rx_missed_errors; /* receiver missed packet */ + + /* detailed tx_errors */ + int tx_aborted_errors; + int tx_carrier_errors; + int tx_fifo_errors; + int tx_heartbeat_errors; + int tx_window_errors; +}; + + +struct hippi_fp_hdr +{ +#if 0 + __u8 ulp; /* must contain 4 */ +#if defined (__BIG_ENDIAN_BITFIELD) + __u8 d1_data_present:1; /* must be 1 */ + __u8 start_d2_burst_boundary:1; /* must be zero */ + __u8 reserved:6; /* must be zero */ +#if 0 + __u16 reserved1:5; + __u16 d1_area_size:8; /* must be 3 */ + __u16 d2_offset:3; /* must be zero */ +#endif +#elif defined(__LITTLE_ENDIAN_BITFIELD) + __u8 reserved:6; /* must be zero */ + __u8 start_d2_burst_boundary:1; /* must be zero */ + __u8 d1_data_present:1; /* must be 1 */ +#if 0 + __u16 d2_offset:3; /* must be zero */ + __u16 d1_area_size:8; /* must be 3 */ + __u16 reserved1:5; /* must be zero */ +#endif +#else +#error "Please fix <asm/byteorder.h>" +#endif +#else + __u32 fixed; +#endif + __u32 d2_size; +} __attribute__ ((packed)); + +struct hippi_le_hdr +{ +#if defined (__BIG_ENDIAN_BITFIELD) + unsigned long fc:3; + unsigned long double_wide:1; + unsigned long message_type:4; +#elif defined(__LITTLE_ENDIAN_BITFIELD) + unsigned long message_type:4; + unsigned long double_wide:1; + unsigned long fc:3; +#endif + __u8 dest_switch_addr[3]; +#if defined (__BIG_ENDIAN_BITFIELD) + __u8 dest_addr_type:4, + src_addr_type:4; +#elif defined(__LITTLE_ENDIAN_BITFIELD) + __u8 src_addr_type:4, + dest_addr_type:4; +#endif + __u8 src_switch_addr[3]; + __u16 reserved; + __u8 daddr[HIPPI_ALEN]; + __u16 locally_administered; + __u8 saddr[HIPPI_ALEN]; +} __attribute__ ((packed)); + +#define HIPPI_OUI_LEN 3 +/* + * Looks like the dsap and ssap fields have been swapped by mistake in + * RFC 2067 "IP over HIPPI". + */ +struct hippi_snap_hdr +{ + __u8 dsap; /* always 0xAA */ + __u8 ssap; /* always 0xAA */ + __u8 ctrl; /* always 0x03 */ + __u8 oui[HIPPI_OUI_LEN]; /* organizational universal id (zero)*/ + __u16 ethertype; /* packet type ID field */ +} __attribute__ ((packed)); + +struct hippi_hdr +{ + struct hippi_fp_hdr fp; + struct hippi_le_hdr le; + struct hippi_snap_hdr snap; +} __attribute__ ((packed)); + +#endif /* _LINUX_IF_HIPPI_H */ diff --git a/include/linux/if_ppp.h b/include/linux/if_ppp.h index 35eb83fa2..bb7a98db3 100644 --- a/include/linux/if_ppp.h +++ b/include/linux/if_ppp.h @@ -1,4 +1,4 @@ -/* $Id: if_ppp.h,v 1.2 1998/01/01 15:05:12 phil Exp $ */ +/* $Id: if_ppp.h,v 1.14 1998/07/07 04:27:33 paulus Exp $ */ /* * if_ppp.h - Point-to-Point Protocol definitions. @@ -21,7 +21,7 @@ */ /* - * ==FILEVERSION 971223== + * ==FILEVERSION 980704== * * NOTE TO MAINTAINERS: * If you modify this file at all, please set the above date. @@ -76,7 +76,7 @@ #define SC_MASK 0x0f0000ff /* bits that user can change */ /* state bits */ -#define SC_XMIT_BUSY 0x10000000 /* ppp_write_wakeup is active */ +#define SC_XMIT_BUSY 0x10000000 /* (used by isdn_ppp?) */ #define SC_RCV_ODDP 0x08000000 /* have rcvd char with odd parity */ #define SC_RCV_EVNP 0x04000000 /* have rcvd char with even parity */ #define SC_RCV_B7_1 0x02000000 /* have rcvd char with bit 7 = 1 */ @@ -89,8 +89,8 @@ */ struct npioctl { - int protocol; /* PPP protocol, e.g. PPP_IP */ - enum NPmode mode; + int protocol; /* PPP protocol, e.g. PPP_IP */ + enum NPmode mode; }; /* Structure describing a CCP configuration option, for PPPIOCSCOMPRESS */ @@ -101,13 +101,13 @@ struct ppp_option_data { }; struct ifpppstatsreq { - struct ifreq b; - struct ppp_stats stats; /* statistic information */ + struct ifreq b; + struct ppp_stats stats; /* statistic information */ }; struct ifpppcstatsreq { - struct ifreq b; - struct ppp_comp_stats stats; + struct ifreq b; + struct ppp_comp_stats stats; }; #define ifr__name b.ifr_ifrn.ifrn_name @@ -138,7 +138,7 @@ struct ifpppcstatsreq { #define PPPIOCGIDLE _IOR('t', 63, struct ppp_idle) /* get idle time */ #define SIOCGPPPSTATS (SIOCDEVPRIVATE + 0) -#define SIOCGPPPVER (SIOCDEVPRIVATE + 1) /* NEVER change this!! */ +#define SIOCGPPPVER (SIOCDEVPRIVATE + 1) /* NEVER change this!! */ #define SIOCGPPPCSTATS (SIOCDEVPRIVATE + 2) #if !defined(ifr_mtu) diff --git a/include/linux/if_pppvar.h b/include/linux/if_pppvar.h index c1fe88ab4..cf70fe655 100644 --- a/include/linux/if_pppvar.h +++ b/include/linux/if_pppvar.h @@ -42,15 +42,15 @@ */ /* - * ==FILEVERSION 971001== + * ==FILEVERSION 980704== * * NOTE TO MAINTAINERS: - * If you modify this file at all, please set the above date. - * if_pppvar.h is shipped with a PPP distribution as well as with the kernel; - * if everyone increases the FILEVERSION number above, then scripts - * can do the right thing when deciding whether to install a new if_pppvar.h - * file. Don't change the format of that line otherwise, so the - * installation script can recognize it. + * If you modify this file at all, please set the above date. + * if_pppvar.h is shipped with a PPP distribution as well as with the kernel; + * if everyone increases the FILEVERSION number above, then scripts + * can do the right thing when deciding whether to install a new if_pppvar.h + * file. Don't change the format of that line otherwise, so the + * installation script can recognize it. */ /* @@ -59,101 +59,74 @@ */ #define NP_IP 0 /* Internet Protocol */ -#define NUM_NP 1 /* Number of NPs. */ +#define NP_IPX 1 /* IPX protocol */ +#define NP_AT 2 /* Appletalk protocol */ +#define NUM_NP 3 /* Number of NPs. */ -/* - * Buffers for the PPP process have the following structure - */ - -#define RBUFSIZE 2048 /* MUST be a power of 2 and be <= 4095 */ - -struct ppp_buffer { - __s32 size; /* Size of the buffer area */ - __s32 count; /* Count of characters in bufr */ - __s32 head; /* index to head of list */ - __s32 tail; /* index to tail of list */ - unsigned long locked; /* Buffer is being sent */ - __s32 type; /* Type of the buffer */ - /* =0, device read buffer */ - /* =1, device write buffer */ - /* =2, daemon write buffer */ - /* =3, daemon read buffer */ - __u16 fcs; /* Frame Check Sequence (CRC) */ - __u16 magic; /* Extra space if needed */ -}; - -/* Given a pointer to the ppp_buffer then return base address of buffer */ -#define buf_base(buf) ((__u8 *) (&buf[1])) +#define OBUFSIZE 256 /* # chars of output buffering */ /* * Structure describing each ppp unit. */ struct ppp { - __s32 magic; /* magic value for structure */ + int magic; /* magic value for structure */ struct ppp *next; /* unit with next index */ - - /* Bitmapped flag fields. */ unsigned long inuse; /* are we allocated? */ - __u8 escape; /* 0x20 if prev char was PPP_ESC*/ + int line; /* network interface unit # */ + __u32 flags; /* miscellaneous control flags */ + int mtu; /* maximum xmit frame size */ + int mru; /* maximum receive frame size */ + struct slcompress *slcomp; /* for TCP header compression */ + struct sk_buff_head xmt_q; /* frames to send from pppd */ + struct sk_buff_head rcv_q; /* frames for pppd to read */ + + /* Information specific to using ppp on async serial lines. */ + struct tty_struct *tty; /* ptr to TTY structure */ + struct tty_struct *backup_tty; /* TTY to use if tty gets closed */ + __u8 escape; /* 0x20 if prev char was PPP_ESC */ __u8 toss; /* toss this frame */ - - __u32 flags; /* miscellany */ - + volatile __u8 tty_pushing; /* internal state flag */ __u32 xmit_async_map[8]; /* 1 bit means that given control character is quoted on output*/ - __u32 recv_async_map; /* 1 bit means that given control character is ignored on input*/ - __s32 mtu; /* maximum xmit frame size */ - __s32 mru; /* maximum receive frame size */ + __u32 bytes_sent; /* Bytes sent on frame */ + __u32 bytes_rcvd; /* Bytes recvd on frame */ - /* Information about the current tty data */ - __s32 line; /* PPP channel number */ - struct tty_struct *tty; /* ptr to TTY structure */ - struct tty_struct *backup_tty; /* TTY to use if tty gets closed */ - __s32 bytes_sent; /* Bytes sent on frame */ - __s32 bytes_rcvd; /* Bytes recvd on frame */ + /* Async transmission information */ + struct sk_buff *tpkt; /* frame currently being sent */ + int tpkt_pos; /* how much of it we've done */ + __u16 tfcs; /* FCS so far for it */ + unsigned char *optr; /* where we're up to in sending */ + unsigned char *olim; /* points past last valid char */ - /* VJ Header compression data */ - struct slcompress *slcomp; /* for header compression */ + /* Async reception information */ + struct sk_buff *rpkt; /* frame currently being rcvd */ + __u16 rfcs; /* FCS so far of rpkt */ - /* Transmission information */ - struct ppp_buffer *xbuf; /* Buffer currently being sent */ - struct ppp_buffer *s1buf; /* Pointer to daemon buffer */ - struct ppp_buffer *s2buf; /* Pointer to device buffer */ + /* Queues for select() functionality */ + struct wait_queue *read_wait; /* queue for reading processes */ + /* info for detecting idle channels */ unsigned long last_xmit; /* time of last transmission */ unsigned long last_recv; /* time last packet received */ - /* These are pointers to the malloc()ed frame buffers. - These buffers are used while processing a packet. If a packet - has to hang around for the user process to read it, it lingers in - the user buffers below. */ - - struct ppp_buffer *wbuf; /* Transmission information */ - struct ppp_buffer *tbuf; /* daemon transmission buffer */ - struct ppp_buffer *rbuf; /* Receive information */ - struct ppp_buffer *ubuf; /* User buffer information */ - struct ppp_buffer *cbuf; /* compression buffer */ - - /* Queues for select() functionality */ - struct wait_queue *write_wait; /* queue for reading processes */ - struct wait_queue *read_wait; /* queue for writing processes */ - /* Statistic information */ - struct pppstat stats; /* statistic information */ + struct pppstat stats; /* statistic information */ /* PPP compression protocol information */ - __u32 sc_bytessent; /* count of octets sent */ - __u32 sc_bytesrcvd; /* count of octets received */ + struct compressor *sc_xcomp; /* transmit compressor */ + void *sc_xc_state; /* transmit compressor state */ + struct compressor *sc_rcomp; /* receive decompressor */ + void *sc_rc_state; /* receive decompressor state */ + enum NPmode sc_npmode[NUM_NP]; /* what to do with each NP */ - struct compressor *sc_xcomp; /* transmit compressor */ - void *sc_xc_state; /* transmit compressor state */ - struct compressor *sc_rcomp; /* receive decompressor */ - void *sc_rc_state; /* receive decompressor state */ - __s32 sc_xfer; /* PID of reserved PPP table */ - char name[8]; + int sc_xfer; /* PID of reserved PPP table */ + char name[8]; /* space for unit name */ struct device dev; /* net device structure */ struct enet_statistics estats; /* more detailed stats */ + + /* tty output buffer */ + unsigned char obuf[OBUFSIZE]; /* buffer for characters to send */ }; diff --git a/include/linux/if_shaper.h b/include/linux/if_shaper.h index 7377867e7..57ffd730a 100644 --- a/include/linux/if_shaper.h +++ b/include/linux/if_shaper.h @@ -18,6 +18,7 @@ struct shaper { struct sk_buff_head sendq; __u32 bytespertick; + __u32 bitspersec; __u32 shapelatency; __u32 shapeclock; __u32 recovery; /* Time we can next clock a packet out on @@ -44,6 +45,8 @@ struct shaper #define SHAPER_SET_DEV 0x0001 #define SHAPER_SET_SPEED 0x0002 +#define SHAPER_GET_DEV 0x0003 +#define SHAPER_GET_SPEED 0x0004 struct shaperconf { diff --git a/include/linux/if_tr.h b/include/linux/if_tr.h index 5d07fcab7..f7c97eeb9 100644 --- a/include/linux/if_tr.h +++ b/include/linux/if_tr.h @@ -59,29 +59,31 @@ struct trllc { /* Token-Ring statistics collection data. */ struct tr_statistics { - int rx_packets; /* total packets received */ - int tx_packets; /* total packets transmitted */ - int rx_errors; /* bad packets received */ - int tx_errors; /* packet transmit problems */ - int rx_dropped; /* no space in linux buffers */ - int tx_dropped; /* no space available in linux */ - int multicast; /* multicast packets received */ - int transmit_collision; + unsigned long rx_packets; /* total packets received */ + unsigned long tx_packets; /* total packets transmitted */ + unsigned long rx_bytes; /* total bytes received */ + unsigned long tx_bytes; /* total bytes transmitted */ + unsigned long rx_errors; /* bad packets received */ + unsigned long tx_errors; /* packet transmit problems */ + unsigned long rx_dropped; /* no space in linux buffers */ + unsigned long tx_dropped; /* no space available in linux */ + unsigned long multicast; /* multicast packets received */ + unsigned long transmit_collision; /* detailed Token-Ring errors. See IBM Token-Ring Network Architecture for more info */ - int line_errors; - int internal_errors; - int burst_errors; - int A_C_errors; - int abort_delimiters; - int lost_frames; - int recv_congest_count; - int frame_copied_errors; - int frequency_errors; - int token_errors; - int dummy1; + unsigned long line_errors; + unsigned long internal_errors; + unsigned long burst_errors; + unsigned long A_C_errors; + unsigned long abort_delimiters; + unsigned long lost_frames; + unsigned long recv_congest_count; + unsigned long frame_copied_errors; + unsigned long frequency_errors; + unsigned long token_errors; + unsigned long dummy1; }; /* source routing stuff */ @@ -93,5 +95,6 @@ struct tr_statistics { #define TR_RCF_LIMITED_BROADCAST 0xC000 /* single-route broadcast */ #define TR_RCF_FRAME2K 0x20 #define TR_RCF_BROADCAST_MASK 0xC000 +#define TR_MAXRIFLEN 18 #endif /* _LINUX_IF_TR_H */ diff --git a/include/linux/if_wic.h b/include/linux/if_wic.h deleted file mode 100644 index cca15f85b..000000000 --- a/include/linux/if_wic.h +++ /dev/null @@ -1,102 +0,0 @@ -#ifndef _LINUX_IF_WIC_H -#define _LINUX_IF_WIC_H - -#include <linux/sockios.h> - -#define SIOCDEVWIC SIOCDEVPRIVATE - -struct wicconf -{ - unsigned char pcmd; - unsigned char data[120]; - unsigned char len; -}; - -/* WIC host to controller commands */ - -#define WIC_AYT 0x10 /* test dki */ -#define WIC_RESET 0x11 /* reset controller */ -#define WIC_SETSN 0x21 /* set station name */ -#define WIC_SETPS 0x22 /* set power saving mode */ -#define WIC_SETAF 0x23 /* set announce filter */ -#define WIC_SETGPF 0x24 /* set GPSP filter */ -#define WIC_GETVERH 0x61 /* get interface controller version */ -#define WIC_GETNL 0x62 /* get neighbor list */ -#define WIC_GETSN 0x65 /* get station name */ -#define WIC_CLRSTATS 0x83 /* clear controller statistics */ -#define WIC_SETNET 0x84 /* set network configuration */ -#define WIC_SETSYS 0x85 /* set system configuration */ -#define WIC_GETSTATS 0xc1 /* get statistics */ -#define WIC_GETVERM 0xc3 /* get MAC version */ -#define WIC_GETNET 0xc4 /* get network configuration */ -#define WIC_GETSYS 0xc5 /* get system configuration */ - -/* - * structure used for the GETNET/SETNET command - */ - -struct wic_net { - unsigned char ula[6]; /* ula of interface */ - unsigned char mode; /* operating mode */ -#define NET_MODE_ME 0x01 /* receive my ula */ -#define NET_MODE_BCAST 0x02 /* receive bcasts */ -#define NET_MODE_MCAST 0x04 /* receive mcasts */ -#define NET_MODE_PROM 0x08 /* promiscuous */ -#define NET_MODE_HC 0x10 /* is a hop coordinator */ -#define NET_MODE_HC_VALID 0x20 /* hc address is valid */ -#define NET_MODE_HCAP 0x40 /* hc is also ap */ -#define NET_MODE_HC_KNOWN 0x80 /* hc is known */ - unsigned char rts_lo; /* rts threshold */ - unsigned char rts_hi; /* rts threshold */ - unsigned char retry; /* retry limit */ - unsigned char hc_ula[6]; /* ula of hc */ - unsigned char key[4]; /* network key */ - unsigned char dsl; /* direct send limit */ - unsigned char res1; /* reserved */ -}; - -/* - * structure used for the GETSYS/SETSYS command - */ - -struct wic_sys { - unsigned char mode; /* set operating mode */ -#define SYS_MODE_ANT_DIV 0x00 /* use antenna diversity */ -#define SYS_MODE_ANT_1 0x01 /* use ant 1 for tx */ -#define SYS_MODE_ANT_2 0x02 /* use ant 2 for tx */ -#define SYS_MODE_HC_LOCK 0x04 /* lock onto current hc */ -#define SYS_MODE_DEBUG 0x08 /* upload failed frames */ -#define SYS_MODE_IAM_AP 0x10 /* I am AP */ -#define SYS_MODE_IAM_HC 0x20 /* I am HC */ -#define SYS_MODE_USE_SKIP 0x40 /* use skipping mechanism */ -#define SYS_MODE_AUTO 0x80 /* station is in auto mode */ - unsigned char switches; /* radio/controller switches */ -#define SYS_SWITCH_STDBY 0x01 /* switch radio to standby */ -#define SYS_SWITCH_TXRX 0x02 /* 1 = tx, manual mode only */ -#define SYS_SWITCH_PA 0x04 /* 1 = enable PA on radio */ -#define SYS_SWITCH_PWR 0x10 /* 1 = hi, 0 = lo power output */ -#define SYS_SWITCH_RES1 0x20 /* reserved, must be 0 */ -#define SYS_SWITCH_LIGHTS 0x40 /* light for tx & rx */ -#define SYS_SWITCH_LIGHTS_HC 0x80 /* light for rx while coordinated */ - unsigned char hop_min; /* hop range */ - unsigned char hop_max; /* hop range */ - unsigned char pre_len; /* preamble length (bytes) */ - unsigned char pre_match; /* valid preamble match (bytes) */ - unsigned char mod; /* data mod: 1 = 8:1, 0 = none */ - unsigned char cca_mode; /* cca flags */ -#define CCA_PKT_DET_BSY 0x01 /* busy if packet is detected */ -#define CCA_VIRT_CARR 0x02 /* use virtual carrier */ -#define CCA_RSSI_BSY 0x04 /* busy if rssi > threshold */ -#define CCA_DATA_BSY 0x08 /* busy if valid data > XXX usec */ - unsigned char dwell_hi; /* dwell time */ - unsigned char dwell_lo; /* dwell time */ - unsigned char hc_timeout; /* HC timeout */ - unsigned char rssi; /* rssi threshold */ - unsigned char hc_rssi; /* rssi of last hc frame */ - unsigned char hc_rssi_chan; /* channel of hc rssi value */ -}; - - -#endif /* _LINUX_IF_WIC_H */ - - diff --git a/include/linux/in6.h b/include/linux/in6.h index 0ebec6ba3..37f0e066d 100644 --- a/include/linux/in6.h +++ b/include/linux/in6.h @@ -126,5 +126,6 @@ struct ipv6_mreq { #define IPV6_MULTICAST_LOOP 19 #define IPV6_ADD_MEMBERSHIP 20 #define IPV6_DROP_MEMBERSHIP 21 +#define IPV6_ROUTER_ALERT 22 #endif diff --git a/include/linux/in_route.h b/include/linux/in_route.h index a64453839..61f25c30a 100644 --- a/include/linux/in_route.h +++ b/include/linux/in_route.h @@ -18,7 +18,6 @@ #define RTCF_MASQ 0x00400000 #define RTCF_SNAT 0x00800000 #define RTCF_DOREDIRECT 0x01000000 -#define RTCF_LOG 0x02000000 #define RTCF_DIRECTSRC 0x04000000 #define RTCF_DNAT 0x08000000 #define RTCF_BROADCAST 0x10000000 diff --git a/include/linux/init.h b/include/linux/init.h index 67a3caaac..4465f38b5 100644 --- a/include/linux/init.h +++ b/include/linux/init.h @@ -9,7 +9,15 @@ * * Usage: * For functions: - * you can surround the whole function declaration + * + * You should add __init immediately before the function name, like: + * + * static void __init initme(int x, int y) + * { + * extern int z; z = x * y; + * } + * + * Depricated: you can surround the whole function declaration * just before function body into __initfunc() macro, like: * * __initfunc (static void initme(int x, int y)) @@ -17,17 +25,20 @@ * extern int z; z = x * y; * } * - * if the function has a prototype somewhere, you can also add + * If the function has a prototype somewhere, you can also add * __init between closing brace of the prototype and semicolon: * * extern int initialize_foobar_device(int, int, int) __init; * * For initialized data: - * you should insert __initdata between the variable name and equal + * You should insert __initdata between the variable name and equal * sign followed by value, e.g.: * * static int init_variable __initdata = 0; * static char linux_logo[] __initdata = { 0x32, 0x36, ... }; + * + * For initialized data not at file scope, i.e. within a function, + * you should use __initlocaldata instead, due to a bug in GCC 2.7. */ /* @@ -48,4 +59,10 @@ #define __INITDATA #endif +#if __GNUC__ >= 2 && __GNUC_MINOR__ >= 8 +#define __initlocaldata __initdata +#else +#define __initlocaldata +#endif + #endif diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index a6c8e89c2..925e70d20 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h @@ -42,19 +42,14 @@ enum { KEYBOARD_BH, CYCLADES_BH, CM206_BH, - JS_BH + JS_BH, + MACSERIAL_BH }; #include <asm/hardirq.h> #include <asm/softirq.h> /* - * Are we in an interrupt context? Either doing bottom half - * or hardware interrupt processing? - */ -#define in_interrupt() (local_irq_count[smp_processor_id()] + local_bh_count[smp_processor_id()] != 0) - -/* * Autoprobing for irqs: * * probe_irq_on() and probe_irq_off() provide robust primitives diff --git a/include/linux/ip_fw.h b/include/linux/ip_fw.h index 0334cb4af..eeaa1eb5f 100644 --- a/include/linux/ip_fw.h +++ b/include/linux/ip_fw.h @@ -1,184 +1,120 @@ /* - * IP firewalling code. This is taken from 4.4BSD. Please note the - * copyright message below. As per the GPL it must be maintained - * and the licenses thus do not conflict. While this port is subject - * to the GPL I also place my modifications under the original - * license in recognition of the original copyright. + * This code is heavily based on the code in ip_fw.h; see that file for + * copyrights and attributions. This code is basically GPL. * - * Ported from BSD to Linux, - * Alan Cox 22/Nov/1994. - * Merged and included the FreeBSD-Current changes at Ugen's request - * (but hey it's a lot cleaner now). Ugen would prefer in some ways - * we waited for his final product but since Linux 1.2.0 is about to - * appear it's not practical - Read: It works, it's not clean but please - * don't consider it to be his standard of finished work. - * Alan. - * - * Fixes: - * Pauline Middelink : Added masquerading. - * Jos Vos : Separate input and output firewall - * chains, new "insert" and "append" - * commands to replace "add" commands, - * add ICMP header to struct ip_fwpkt. - * Jos Vos : Add support for matching device names. - * Willy Konynenberg : Add transparent proxying support. - * Jos Vos : Add options for input/output accounting. - * - * All the real work was done by ..... - */ - -/* - * Copyright (c) 1993 Daniel Boulet - * Copyright (c) 1994 Ugen J.S.Antsilevich - * - * Redistribution and use in source forms, with and without modification, - * are permitted provided that this entire comment appears intact. - * - * Redistribution in binary form may occur without any restrictions. - * Obviously, it would be nice if you gave credit where credit is due - * but requiring it would be too onerous. - * - * This software is provided ``AS IS'' without any warranties of any kind. + * 15-Feb-1997: Major changes to allow graphs for firewall rules. + * Paul Russell <Paul.Russell@rustcorp.com.au> and + * Michael Neuling <Michael.Neuling@rustcorp.com.au> + * 2-Nov-1997: Changed types to __u16, etc. + * Removed IP_FW_F_TCPACK & IP_FW_F_BIDIR. + * Added inverse flags field. + * Removed multiple port specs. */ /* * Format of an IP firewall descriptor * * src, dst, src_mask, dst_mask are always stored in network byte order. - * flags and num_*_ports are stored in host byte order (of course). + * flags are stored in host byte order (of course). * Port numbers are stored in HOST byte order. */ -#ifndef _IP_FW_H -#define _IP_FW_H +#ifndef _IP_FWCHAINS_H +#define _IP_FWCHAINS_H -#ifdef __KERNEL__ #include <linux/icmp.h> #include <linux/in.h> #include <linux/ip.h> #include <linux/tcp.h> #include <linux/udp.h> -#endif +#define IP_FW_MAX_LABEL_LENGTH 8 +typedef char ip_chainlabel[IP_FW_MAX_LABEL_LENGTH+1]; struct ip_fw { - struct ip_fw *fw_next; /* Next firewall on chain */ struct in_addr fw_src, fw_dst; /* Source and destination IP addr */ struct in_addr fw_smsk, fw_dmsk; /* Mask for src and dest IP addr */ - struct in_addr fw_via; /* IP address of interface "via" */ - struct device *fw_viadev; /* device of interface "via" */ - __u16 fw_flg; /* Flags word */ - __u16 fw_nsp, fw_ndp; /* N'of src ports and # of dst ports */ - /* in ports array (dst ports follow */ - /* src ports; max of 10 ports in all; */ - /* count of 0 means match all ports) */ -#define IP_FW_MAX_PORTS 10 /* A reasonable maximum */ - __u16 fw_pts[IP_FW_MAX_PORTS]; /* Array of port numbers to match */ - unsigned long fw_pcnt,fw_bcnt; /* Packet and byte counters */ - __u8 fw_tosand, fw_tosxor; /* Revised packet priority */ + __u32 fw_mark; /* ID to stamp on packet */ + __u16 fw_proto; /* Protocol, 0 = ANY */ + __u16 fw_flg; /* Flags word */ + __u16 fw_invflg; /* Inverse flags */ + __u16 fw_spts[2]; /* Source port range. */ + __u16 fw_dpts[2]; /* Destination port range. */ + __u16 fw_redirpt; /* Port to redirect to. */ + __u16 fw_outputsize; /* Max amount to output to + NETLINK */ char fw_vianame[IFNAMSIZ]; /* name of interface "via" */ + __u8 fw_tosand, fw_tosxor; /* Revised packet priority */ }; -/* - * Values for "flags" field . - */ +struct ip_fwuser +{ + struct ip_fw ipfw; + ip_chainlabel label; +}; -#define IP_FW_F_ALL 0x0000 /* This is a universal packet firewall*/ -#define IP_FW_F_TCP 0x0001 /* This is a TCP packet firewall */ -#define IP_FW_F_UDP 0x0002 /* This is a UDP packet firewall */ -#define IP_FW_F_ICMP 0x0003 /* This is a ICMP packet firewall */ -#define IP_FW_F_KIND 0x0003 /* Mask to isolate firewall kind */ -#define IP_FW_F_ACCEPT 0x0004 /* This is an accept firewall (as * - * opposed to a deny firewall)* - * */ -#define IP_FW_F_SRNG 0x0008 /* The first two src ports are a min * - * and max range (stored in host byte * - * order). * - * */ -#define IP_FW_F_DRNG 0x0010 /* The first two dst ports are a min * - * and max range (stored in host byte * - * order). * - * (ports[0] <= port <= ports[1]) * - * */ -#define IP_FW_F_PRN 0x0020 /* In verbose mode print this firewall*/ -#define IP_FW_F_BIDIR 0x0040 /* For bidirectional firewalls */ -#define IP_FW_F_TCPSYN 0x0080 /* For tcp packets-check SYN only */ -#define IP_FW_F_ICMPRPL 0x0100 /* Send back icmp unreachable packet */ -#define IP_FW_F_MASQ 0x0200 /* Masquerading */ -#define IP_FW_F_TCPACK 0x0400 /* For tcp-packets match if ACK is set*/ -#define IP_FW_F_REDIR 0x0800 /* Redirect to local port fw_pts[n] */ -#define IP_FW_F_ACCTIN 0x1000 /* Account incoming packets only. */ -#define IP_FW_F_ACCTOUT 0x2000 /* Account outgoing packets only. */ - -#define IP_FW_F_MASK 0x3FFF /* All possible flag bits mask */ +/* Values for "fw_flg" field . */ +#define IP_FW_F_PRN 0x0001 /* Print packet if it matches */ +#define IP_FW_F_TCPSYN 0x0002 /* For tcp packets-check SYN only */ +#define IP_FW_F_FRAG 0x0004 /* Set if rule is a fragment rule */ +#define IP_FW_F_MARKABS 0x0008 /* Set the mark to fw_mark, not add. */ +#define IP_FW_F_WILDIF 0x0010 /* Need only match start of interface name. */ +#define IP_FW_F_NETLINK 0x0020 /* Redirect to netlink: 2.1.x only */ +#define IP_FW_F_MASK 0x003F /* All possible flag bits mask */ + +/* Values for "fw_invflg" field. */ +#define IP_FW_INV_SRCIP 0x0001 /* Invert the sense of fw_src. */ +#define IP_FW_INV_DSTIP 0x0002 /* Invert the sense of fw_dst. */ +#define IP_FW_INV_PROTO 0x0004 /* Invert the sense of fw_proto. */ +#define IP_FW_INV_SRCPT 0x0008 /* Invert the sense of source ports. */ +#define IP_FW_INV_DSTPT 0x0010 /* Invert the sense of destination ports. */ +#define IP_FW_INV_VIA 0x0020 /* Invert the sense of fw_vianame. */ +#define IP_FW_INV_SYN 0x0040 /* Invert the sense of IP_FW_F_TCPSYN. */ +#define IP_FW_INV_FRAG 0x0080 /* Invert the sense of IP_FW_F_FRAG. */ /* * New IP firewall options for [gs]etsockopt at the RAW IP level. * Unlike BSD Linux inherits IP options so you don't have to use - * a raw socket for this. Instead we check rights in the calls. - */ + * a raw socket for this. Instead we check rights in the calls. */ #define IP_FW_BASE_CTL 64 /* base for firewall socket options */ -#define IP_FW_COMMAND 0x00FF /* mask for command without chain */ -#define IP_FW_TYPE 0x0300 /* mask for type (chain) */ -#define IP_FW_SHIFT 8 /* shift count for type (chain) */ - -#define IP_FW_FWD 0 -#define IP_FW_IN 1 -#define IP_FW_OUT 2 -#define IP_FW_ACCT 3 -#define IP_FW_CHAINS 4 /* total number of ip_fw chains */ -#define IP_FW_MASQ 5 - -#define IP_FW_INSERT (IP_FW_BASE_CTL) -#define IP_FW_APPEND (IP_FW_BASE_CTL+1) -#define IP_FW_DELETE (IP_FW_BASE_CTL+2) -#define IP_FW_FLUSH (IP_FW_BASE_CTL+3) -#define IP_FW_ZERO (IP_FW_BASE_CTL+4) -#define IP_FW_POLICY (IP_FW_BASE_CTL+5) -#define IP_FW_CHECK (IP_FW_BASE_CTL+6) -#define IP_FW_MASQ_TIMEOUTS (IP_FW_BASE_CTL+7) - -#define IP_FW_INSERT_FWD (IP_FW_INSERT | (IP_FW_FWD << IP_FW_SHIFT)) -#define IP_FW_APPEND_FWD (IP_FW_APPEND | (IP_FW_FWD << IP_FW_SHIFT)) -#define IP_FW_DELETE_FWD (IP_FW_DELETE | (IP_FW_FWD << IP_FW_SHIFT)) -#define IP_FW_FLUSH_FWD (IP_FW_FLUSH | (IP_FW_FWD << IP_FW_SHIFT)) -#define IP_FW_ZERO_FWD (IP_FW_ZERO | (IP_FW_FWD << IP_FW_SHIFT)) -#define IP_FW_POLICY_FWD (IP_FW_POLICY | (IP_FW_FWD << IP_FW_SHIFT)) -#define IP_FW_CHECK_FWD (IP_FW_CHECK | (IP_FW_FWD << IP_FW_SHIFT)) - -#define IP_FW_INSERT_IN (IP_FW_INSERT | (IP_FW_IN << IP_FW_SHIFT)) -#define IP_FW_APPEND_IN (IP_FW_APPEND | (IP_FW_IN << IP_FW_SHIFT)) -#define IP_FW_DELETE_IN (IP_FW_DELETE | (IP_FW_IN << IP_FW_SHIFT)) -#define IP_FW_FLUSH_IN (IP_FW_FLUSH | (IP_FW_IN << IP_FW_SHIFT)) -#define IP_FW_ZERO_IN (IP_FW_ZERO | (IP_FW_IN << IP_FW_SHIFT)) -#define IP_FW_POLICY_IN (IP_FW_POLICY | (IP_FW_IN << IP_FW_SHIFT)) -#define IP_FW_CHECK_IN (IP_FW_CHECK | (IP_FW_IN << IP_FW_SHIFT)) - -#define IP_FW_INSERT_OUT (IP_FW_INSERT | (IP_FW_OUT << IP_FW_SHIFT)) -#define IP_FW_APPEND_OUT (IP_FW_APPEND | (IP_FW_OUT << IP_FW_SHIFT)) -#define IP_FW_DELETE_OUT (IP_FW_DELETE | (IP_FW_OUT << IP_FW_SHIFT)) -#define IP_FW_FLUSH_OUT (IP_FW_FLUSH | (IP_FW_OUT << IP_FW_SHIFT)) -#define IP_FW_ZERO_OUT (IP_FW_ZERO | (IP_FW_OUT << IP_FW_SHIFT)) -#define IP_FW_POLICY_OUT (IP_FW_POLICY | (IP_FW_OUT << IP_FW_SHIFT)) -#define IP_FW_CHECK_OUT (IP_FW_CHECK | (IP_FW_OUT << IP_FW_SHIFT)) - -#define IP_ACCT_INSERT (IP_FW_INSERT | (IP_FW_ACCT << IP_FW_SHIFT)) -#define IP_ACCT_APPEND (IP_FW_APPEND | (IP_FW_ACCT << IP_FW_SHIFT)) -#define IP_ACCT_DELETE (IP_FW_DELETE | (IP_FW_ACCT << IP_FW_SHIFT)) -#define IP_ACCT_FLUSH (IP_FW_FLUSH | (IP_FW_ACCT << IP_FW_SHIFT)) -#define IP_ACCT_ZERO (IP_FW_ZERO | (IP_FW_ACCT << IP_FW_SHIFT)) - -#define IP_FW_MASQ_INSERT (IP_FW_INSERT | (IP_FW_MASQ << IP_FW_SHIFT)) -#define IP_FW_MASQ_ADD (IP_FW_APPEND | (IP_FW_MASQ << IP_FW_SHIFT)) -#define IP_FW_MASQ_DEL (IP_FW_DELETE | (IP_FW_MASQ << IP_FW_SHIFT)) -#define IP_FW_MASQ_FLUSH (IP_FW_FLUSH | (IP_FW_MASQ << IP_FW_SHIFT)) - -#define IP_FW_MASQ_INSERT (IP_FW_INSERT | (IP_FW_MASQ << IP_FW_SHIFT)) -#define IP_FW_MASQ_ADD (IP_FW_APPEND | (IP_FW_MASQ << IP_FW_SHIFT)) -#define IP_FW_MASQ_DEL (IP_FW_DELETE | (IP_FW_MASQ << IP_FW_SHIFT)) -#define IP_FW_MASQ_FLUSH (IP_FW_FLUSH | (IP_FW_MASQ << IP_FW_SHIFT)) +#define IP_FW_APPEND (IP_FW_BASE_CTL) /* Takes ip_fwchange */ +#define IP_FW_REPLACE (IP_FW_BASE_CTL+1) /* Takes ip_fwnew */ +#define IP_FW_DELETE_NUM (IP_FW_BASE_CTL+2) /* Takes ip_fwdelnum */ +#define IP_FW_DELETE (IP_FW_BASE_CTL+3) /* Takes ip_fwchange */ +#define IP_FW_INSERT (IP_FW_BASE_CTL+4) /* Takes ip_fwnew */ +#define IP_FW_FLUSH (IP_FW_BASE_CTL+5) /* Takes ip_chainlabel */ +#define IP_FW_ZERO (IP_FW_BASE_CTL+6) /* Takes ip_chainlabel */ +#define IP_FW_CHECK (IP_FW_BASE_CTL+7) /* Takes ip_fwtest */ +#define IP_FW_MASQ_TIMEOUTS (IP_FW_BASE_CTL+8) /* Takes 3 ints */ +#define IP_FW_CREATECHAIN (IP_FW_BASE_CTL+9) /* Takes ip_chainlabel */ +#define IP_FW_DELETECHAIN (IP_FW_BASE_CTL+10) /* Takes ip_chainlabel */ +#define IP_FW_POLICY (IP_FW_BASE_CTL+11) /* Takes ip_fwpolicy */ +/* Masquerade controls */ +#define IP_FW_MASQ_INSERT (IP_FW_BASE_CTL+12) +#define IP_FW_MASQ_ADD (IP_FW_BASE_CTL+13) +#define IP_FW_MASQ_DEL (IP_FW_BASE_CTL+14) +#define IP_FW_MASQ_FLUSH (IP_FW_BASE_CTL+15) + +/* Builtin chain labels */ +#define IP_FW_LABEL_FORWARD "forward" +#define IP_FW_LABEL_INPUT "input" +#define IP_FW_LABEL_OUTPUT "output" + +/* Special targets */ +#define IP_FW_LABEL_MASQUERADE "MASQ" +#define IP_FW_LABEL_REDIRECT "REDIRECT" +#define IP_FW_LABEL_ACCEPT "ACCEPT" +#define IP_FW_LABEL_BLOCK "DENY" +#define IP_FW_LABEL_REJECT "REJECT" +#define IP_FW_LABEL_RETURN "RETURN" +#define IP_FW_LABEL_QUEUE "QUEUE" + +/* Files in /proc/net */ +#define IP_FW_PROC_CHAINS "ip_fwchains" +#define IP_FW_PROC_CHAIN_NAMES "ip_fwnames" + struct ip_fwpkt { @@ -192,6 +128,48 @@ struct ip_fwpkt char fwp_vianame[IFNAMSIZ]; /* interface name */ }; +/* The argument to IP_FW_DELETE and IP_FW_APPEND */ +struct ip_fwchange +{ + struct ip_fwuser fwc_rule; + ip_chainlabel fwc_label; +}; + +/* The argument to IP_FW_CHECK. */ +struct ip_fwtest +{ + struct ip_fwpkt fwt_packet; /* Packet to be tested */ + ip_chainlabel fwt_label; /* Block to start test in */ +}; + +/* The argument to IP_FW_DELETE_NUM */ +struct ip_fwdelnum +{ + __u32 fwd_rulenum; + ip_chainlabel fwd_label; +}; + +/* The argument to IP_FW_REPLACE and IP_FW_INSERT */ +struct ip_fwnew +{ + __u32 fwn_rulenum; + struct ip_fwuser fwn_rule; + ip_chainlabel fwn_label; +}; + +/* The argument to IP_FW_POLICY */ +struct ip_fwpolicy +{ + ip_chainlabel fwp_policy; + ip_chainlabel fwp_label; +}; +/* + * timeouts for ip masquerading + */ + +struct ip_fw_masq; + +/* Masquerading stuff */ #define IP_FW_MASQCTL_MAX 256 #define IP_MASQ_MOD_NMAX 32 @@ -206,11 +184,7 @@ struct ip_fw_masqctl } u; }; -/* - * timeouts for ip masquerading - */ -struct ip_fw_masq; /* * Main firewall chains definitions and global var's definitions. @@ -218,37 +192,18 @@ struct ip_fw_masq; #ifdef __KERNEL__ -/* Modes used in the ip_fw_chk() routine. */ -#define IP_FW_MODE_FW 0x00 /* kernel firewall check */ -#define IP_FW_MODE_ACCT_IN 0x01 /* accounting (incoming) */ -#define IP_FW_MODE_ACCT_OUT 0x02 /* accounting (outgoing) */ -#define IP_FW_MODE_CHK 0x04 /* check requested by user */ - #include <linux/config.h> -#ifdef CONFIG_IP_FIREWALL -extern struct ip_fw *ip_fw_in_chain; -extern struct ip_fw *ip_fw_out_chain; -extern struct ip_fw *ip_fw_fwd_chain; -extern int ip_fw_in_policy; -extern int ip_fw_out_policy; -extern int ip_fw_fwd_policy; +#include <linux/version.h> +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,0) +#include <linux/init.h> +extern void ip_fw_init(void) __init; +#else /* 2.0.x */ +extern void ip_fw_init(void); +#endif /* 2.1.x */ extern int ip_fw_ctl(int, void *, int); -#endif -#ifdef CONFIG_IP_ACCT -extern struct ip_fw *ip_acct_chain; -extern int ip_acct_ctl(int, void *, int); -#endif #ifdef CONFIG_IP_MASQUERADE extern int ip_masq_ctl(int, void *, int); #endif -#ifdef CONFIG_IP_MASQUERADE -extern int ip_masq_ctl(int, void *, int); -#endif - -extern int ip_fw_chk(struct iphdr *, struct device *, __u16 *, struct ip_fw *, int, int); -extern void ip_fw_init(void); #endif /* KERNEL */ - - -#endif /* _IP_FW_H */ +#endif /* _IP_FWCHAINS_H */ diff --git a/include/linux/ipx.h b/include/linux/ipx.h index d3aa23844..c6846779b 100644 --- a/include/linux/ipx.h +++ b/include/linux/ipx.h @@ -41,7 +41,7 @@ typedef struct ipx_interface_definition #define IPX_FRAME_8022 2 #define IPX_FRAME_ETHERII 3 #define IPX_FRAME_8023 4 -#define IPX_FRAME_TR_8022 5 +#define IPX_FRAME_TR_8022 5 /* obsolete */ unsigned char ipx_special; #define IPX_SPECIAL_NONE 0 #define IPX_PRIMARY 1 @@ -82,6 +82,7 @@ struct ipx_route_def extern int ipxrtr_route_skb(struct sk_buff *); extern int ipx_if_offset(unsigned long ipx_net_number); +extern void ipx_remove_socket(struct sock *sk); #endif /* def __KERNEL__ */ #endif /* def _IPX_H_ */ diff --git a/include/linux/iso_fs.h b/include/linux/iso_fs.h index a81dc1296..30a14b169 100644 --- a/include/linux/iso_fs.h +++ b/include/linux/iso_fs.h @@ -182,6 +182,7 @@ extern char * get_rock_ridge_symlink(struct inode *); extern int find_rock_ridge_relocation(struct iso_directory_record *, struct inode *); int get_joliet_filename(struct iso_directory_record *, struct inode *, unsigned char *); +int get_acorn_filename(struct iso_directory_record *, char *, struct inode *); /* The stuff that follows may be totally unneeded. I have not checked to see which prototypes we are still using. */ @@ -227,6 +228,3 @@ extern void leak_check_brelse(struct buffer_head * bh); #endif /* __KERNEL__ */ #endif - - - diff --git a/include/linux/iso_fs_sb.h b/include/linux/iso_fs_sb.h index 834ae348b..879f8faf3 100644 --- a/include/linux/iso_fs_sb.h +++ b/include/linux/iso_fs_sb.h @@ -30,10 +30,3 @@ struct isofs_sb_info { }; #endif - - - - - - - diff --git a/include/linux/joystick.h b/include/linux/joystick.h index 2a3f1f8ba..513801cbe 100644 --- a/include/linux/joystick.h +++ b/include/linux/joystick.h @@ -2,9 +2,9 @@ #define _LINUX_JOYSTICK_H /* - * $Id: joystick.h,v 1.3 1998/03/30 11:10:40 mj Exp $ + * /usr/include/linux/joystick.h Version 1.0.9 * - * Copyright (C) 1997, 1998 Vojtech Pavlik + * Copyright (C) 1996-1998 Vojtech Pavlik */ #include <asm/types.h> @@ -13,26 +13,26 @@ * Version */ -#define JS_VERSION 0x00010007L /* 1.0.7 BCD */ +#define JS_VERSION 0x00010008L /* * IOCTL commands for joystick driver */ -#define JSIOCGVERSION _IOR('j', 0x01, __u32) /* get driver version */ +#define JSIOCGVERSION _IOR('j', 0x01, __u32) /* get driver version */ -#define JSIOCGAXES _IOR('j', 0x11, __u8) /* get number of axes */ -#define JSIOCGBUTTONS _IOR('j', 0x12, __u8) /* get number of buttons */ +#define JSIOCGAXES _IOR('j', 0x11, __u8) /* get number of axes */ +#define JSIOCGBUTTONS _IOR('j', 0x12, __u8) /* get number of buttons */ -#define JSIOCSCORR _IOW('j', 0x21, struct js_corr[4]) /* set correction values */ -#define JSIOCGCORR _IOR('j', 0x22, struct js_corr[4]) /* get correction values */ +#define JSIOCSCORR _IOW('j', 0x21, struct js_corr[4]) /* set correction values */ +#define JSIOCGCORR _IOR('j', 0x22, struct js_corr[4]) /* get correction values */ /* * Types and constants for get/set correction */ -#define JS_CORR_NONE 0x00 /* returns raw values */ -#define JS_CORR_BROKEN 0x01 /* broken line */ +#define JS_CORR_NONE 0x00 /* returns raw values */ +#define JS_CORR_BROKEN 0x01 /* broken line */ struct js_corr { __s32 coef[8]; @@ -46,13 +46,13 @@ struct js_corr { #define JS_EVENT_BUTTON 0x01 /* button pressed/released */ #define JS_EVENT_AXIS 0x02 /* joystick moved */ -#define JS_EVENT_INIT 0x80 /* initial state of device */ +#define JS_EVENT_INIT 0x80 /* initial state of device at open time */ struct js_event { - __u32 time; /* time when event happened in miliseconds since open */ - __u16 value; /* new value */ - __u8 type; /* type of event, see above */ - __u8 number; /* axis/button number */ + __u32 time; /* event timestamp in miliseconds since open */ + __s16 value; /* value */ + __u8 type; /* type of event, see above */ + __u8 number; /* axis/button number */ }; /* @@ -62,16 +62,16 @@ struct js_event { #define JS_RETURN sizeof(struct JS_DATA_TYPE) #define JS_TRUE 1 #define JS_FALSE 0 -#define JS_X_0 0x01 /* bit mask for x-axis js0 */ -#define JS_Y_0 0x02 /* bit mask for y-axis js0 */ -#define JS_X_1 0x04 /* bit mask for x-axis js1 */ -#define JS_Y_1 0x08 /* bit mask for y-axis js1 */ -#define JS_MAX 2 /* max number of joysticks */ +#define JS_X_0 0x01 /* bit mask for x-axis js0 */ +#define JS_Y_0 0x02 /* bit mask for y-axis js0 */ +#define JS_X_1 0x04 /* bit mask for x-axis js1 */ +#define JS_Y_1 0x08 /* bit mask for y-axis js1 */ +#define JS_MAX 2 /* max number of joysticks */ struct JS_DATA_TYPE { - int buttons; /* immediate button state */ - int x; /* immediate x axis value */ - int y; /* immediate y axis value */ + int buttons; /* immediate button state */ + int x; /* immediate x axis value */ + int y; /* immediate y axis value */ }; diff --git a/include/linux/kbd_kern.h b/include/linux/kbd_kern.h index 2d7dc1b7e..f5ae9ed93 100644 --- a/include/linux/kbd_kern.h +++ b/include/linux/kbd_kern.h @@ -138,4 +138,27 @@ extern inline void chg_vc_kbd_led(struct kbd_struct * kbd, int flag) #define U(x) ((x) ^ 0xf000) +/* keyboard.c */ + +struct console; + +int getkeycode(unsigned int scancode); +int setkeycode(unsigned int scancode, unsigned int keycode); +void compute_shiftstate(void); +int keyboard_wait_for_keypress(struct console *); + +/* defkeymap.c */ + +extern unsigned int keymap_count; + +/* console.c */ + +extern task_queue con_task_queue; + +extern inline void con_schedule_flip(struct tty_struct *t) +{ + queue_task(&t->flip.tqueue, &con_task_queue); + mark_bh(CONSOLE_BH); +} + #endif diff --git a/include/linux/kd.h b/include/linux/kd.h index 0f669cbe6..c717c1981 100644 --- a/include/linux/kd.h +++ b/include/linux/kd.h @@ -132,8 +132,49 @@ struct kbkeycode { #define KDSIGACCEPT 0x4B4E /* accept kbd generated signals */ +struct hwclk_time { + unsigned sec; /* 0..59 */ + unsigned min; /* 0..59 */ + unsigned hour; /* 0..23 */ + unsigned day; /* 1..31 */ + unsigned mon; /* 0..11 */ + unsigned year; /* 70... */ + int wday; /* 0..6, 0 is Sunday, -1 means unknown/don't set */ +}; + +#define KDGHWCLK 0x4B50 /* get hardware clock */ +#define KDSHWCLK 0x4B51 /* set hardware clock */ + +struct kbd_repeat { + int delay; /* in msec; <= 0: don't change */ + int rate; /* in msec; <= 0: don't change */ +}; + +#define KDKBDREP 0x4B52 /* set keyboard delay/repeat rate; + * actually used values are returned */ + +#define KDFONTOP 0x4B72 /* font operations */ + +struct console_font_op { + unsigned int op; /* operation code KD_FONT_OP_* */ + unsigned int flags; /* KD_FONT_FLAG_* */ + unsigned int width, height; /* font size */ + unsigned int charcount; + unsigned char *data; /* font data with height fixed to 32 */ +}; + +#define KD_FONT_OP_SET 0 /* Set font */ +#define KD_FONT_OP_GET 1 /* Get font */ +#define KD_FONT_OP_SET_DEFAULT 2 /* Set font to default, data points to name / NULL */ +#define KD_FONT_OP_COPY 3 /* Copy from another console */ + +#define KD_FONT_FLAG_DONT_RECALC 1 /* Don't recalculate hw charcell size [compat] */ +#ifdef __KERNEL__ +#define KD_FONT_FLAG_OLD 0x80000000 /* Invoked via old interface [compat] */ +#endif + /* note: 0x4B00-0x4B4E all have had a value at some time; don't reuse for the time being */ -/* note: 0x4B60-0x4B6D, 0x4B70, 0x4B71 used above */ +/* note: 0x4B60-0x4B6D, 0x4B70-0x4B72 used above */ #endif /* _LINUX_KD_H */ diff --git a/include/linux/kernel_stat.h b/include/linux/kernel_stat.h index 6bf0d79cb..cd584c1af 100644 --- a/include/linux/kernel_stat.h +++ b/include/linux/kernel_stat.h @@ -2,13 +2,12 @@ #define _LINUX_KERNEL_STAT_H #include <asm/irq.h> -#include <asm/smp.h> #include <linux/smp.h> #include <linux/tasks.h> /* * 'kernel_stat.h' contains the definitions needed for doing - * some kernel statistics (cpu usage, context switches ...), + * some kernel statistics (CPU usage, context switches ...), * used by rstatd/perfmeter */ diff --git a/include/linux/keyboard.h b/include/linux/keyboard.h index d54377d96..6829c6536 100644 --- a/include/linux/keyboard.h +++ b/include/linux/keyboard.h @@ -25,6 +25,7 @@ extern const int max_vals[]; extern unsigned short *key_maps[MAX_NR_KEYMAPS]; extern unsigned short plain_map[NR_KEYS]; extern struct wait_queue * keypress_wait; +extern unsigned char keyboard_type; #endif #define MAX_NR_FUNC 256 /* max nr of strings assigned to keys */ diff --git a/include/linux/linux_logo.h b/include/linux/linux_logo.h new file mode 100644 index 000000000..07cde4f87 --- /dev/null +++ b/include/linux/linux_logo.h @@ -0,0 +1,1444 @@ +/* $Id: linux_logo.h,v 1.3 1998/07/06 15:51:16 jj Exp $ + * include/linux/linux_logo.h: This is a linux logo + * to be displayed on boot. + * + * Copyright (C) 1996 Larry Ewing (lewing@isc.tamu.edu) + * Copyright (C) 1996 Jakub Jelinek (jj@sunsite.mff.cuni.cz) + * + * You can put anything here, but: + * LINUX_LOGO_COLORS has to be less than 224 + * image size has to be 80x80 + * values have to start from 0x20 + * (i.e. RGB(linux_logo_red[0], + * linux_logo_green[0], + * linux_logo_blue[0]) is color 0x20) + * BW image has to be 80x80 as well, with MS bit + * on the left + * Serial_console ascii image can be any size, + * but should contain %s to display the version + */ + +#if LINUX_LOGO_COLORS == 221 + +unsigned char linux_logo_red[] __initdata = { + 0xF3, 0xF6, 0xF8, 0xF7, 0xEF, 0xE7, 0xE5, 0xE3, + 0xCA, 0xD4, 0xDD, 0xC8, 0xC7, 0xC4, 0xC2, 0xE5, + 0xF1, 0xED, 0xEE, 0xE6, 0xC6, 0xDA, 0xDD, 0xE5, + 0xD9, 0xC6, 0xE3, 0xD0, 0xC6, 0xBA, 0xB0, 0xB6, + 0xBB, 0xBE, 0xB9, 0xB8, 0xB3, 0xB2, 0xB0, 0xAD, + 0xAC, 0xA9, 0xA8, 0xA6, 0xA4, 0xA1, 0xA0, 0x9D, + 0xA0, 0x9F, 0x9E, 0x9C, 0x9B, 0x99, 0x9A, 0x99, + 0x98, 0x95, 0x96, 0x94, 0x93, 0x92, 0x8F, 0x8D, + 0x8C, 0x8A, 0x87, 0x86, 0x83, 0x81, 0x0D, 0x03, + 0x66, 0x44, 0x24, 0x08, 0xD6, 0xE6, 0xE9, 0xE6, + 0xE7, 0xCA, 0xDC, 0xDB, 0xD5, 0xD0, 0xC9, 0xE2, + 0xD5, 0xC6, 0xC4, 0xB3, 0xB2, 0xB9, 0xA9, 0x9A, + 0xB2, 0x9D, 0xE8, 0xEC, 0xF5, 0xF5, 0xF4, 0xF4, + 0xEC, 0xEE, 0xF0, 0xF5, 0xE0, 0xD6, 0xC5, 0xC2, + 0xD9, 0xD5, 0xD8, 0xD6, 0xF6, 0xF4, 0xED, 0xEC, + 0xEB, 0xF1, 0xF6, 0xF5, 0xF5, 0xEE, 0xEF, 0xEC, + 0xE7, 0xE3, 0xE6, 0xD6, 0xDD, 0xC3, 0xD6, 0xD7, + 0xCD, 0xCA, 0xC3, 0xAC, 0x95, 0x99, 0xB7, 0xA3, + 0x8B, 0x88, 0x95, 0x8A, 0x94, 0xD2, 0xCC, 0xC4, + 0xA8, 0x8E, 0x8F, 0xAE, 0xB8, 0xAC, 0xB6, 0xB4, + 0xAD, 0xA5, 0xA0, 0x9B, 0x8B, 0xA3, 0x94, 0x87, + 0x85, 0x89, 0x53, 0x80, 0x7D, 0x7C, 0x7A, 0x78, + 0x76, 0x71, 0x73, 0x6E, 0x6B, 0x67, 0x65, 0x62, + 0x4B, 0x5B, 0x5F, 0x53, 0x56, 0x52, 0x4F, 0x46, + 0x42, 0x0F, 0x75, 0x78, 0x7D, 0x72, 0x5F, 0x6E, + 0x7A, 0x75, 0x6A, 0x58, 0x48, 0x4F, 0x00, 0x2B, + 0x37, 0x3E, 0x32, 0x33, 0x25, 0x2C, 0x3B, 0x11, + 0x1D, 0x14, 0x06, 0x02, 0x00 +}; + +unsigned char linux_logo_green[] __initdata = { + 0xF3, 0xF6, 0xF8, 0xF7, 0xEF, 0xE7, 0xE5, 0xE3, + 0xCA, 0xD4, 0xDD, 0xC8, 0xC7, 0xC4, 0xC2, 0xD3, + 0xDA, 0xD4, 0xD7, 0xCC, 0xC1, 0xCC, 0xCB, 0xC9, + 0xC5, 0xBC, 0xBC, 0xBB, 0xB7, 0xA5, 0xB0, 0xB6, + 0xBB, 0xBE, 0xB9, 0xB8, 0xB3, 0xB2, 0xAD, 0xAD, + 0xAC, 0xA9, 0xA8, 0xA6, 0xA4, 0xA1, 0xA0, 0x95, + 0xA0, 0x9F, 0x9E, 0x9C, 0x9B, 0x99, 0x9A, 0x99, + 0x98, 0x95, 0x96, 0x94, 0x93, 0x92, 0x8F, 0x8D, + 0x8C, 0x8A, 0x87, 0x86, 0x83, 0x81, 0x08, 0x02, + 0x53, 0x2E, 0x19, 0x06, 0xC6, 0xC8, 0xCF, 0xBD, + 0xB3, 0xB6, 0xB4, 0xAB, 0xA5, 0xA3, 0x9B, 0xB6, + 0xA7, 0x99, 0x92, 0xA4, 0x9E, 0x9D, 0x98, 0x8C, + 0x8A, 0x86, 0xCD, 0xCC, 0xC9, 0xD7, 0xCA, 0xC4, + 0xCA, 0xC3, 0xC7, 0xC3, 0xC8, 0xB4, 0x91, 0x8E, + 0x8A, 0x82, 0x87, 0x85, 0xBD, 0xBF, 0xB6, 0xBC, + 0xAE, 0xB7, 0xBC, 0xB8, 0xBF, 0xB6, 0xBC, 0xB5, + 0xAB, 0xA6, 0xAD, 0xB2, 0xA5, 0x87, 0x9C, 0x96, + 0x95, 0x8E, 0x87, 0x8F, 0x86, 0x86, 0x8E, 0x80, + 0x7A, 0x70, 0x7B, 0x78, 0x78, 0x7F, 0x77, 0x6F, + 0x70, 0x76, 0x59, 0x77, 0x68, 0x64, 0x7B, 0x7C, + 0x75, 0x6D, 0x77, 0x69, 0x65, 0x5F, 0x5B, 0x54, + 0x4F, 0x5B, 0x39, 0x80, 0x7D, 0x7C, 0x7A, 0x78, + 0x76, 0x71, 0x73, 0x6E, 0x6B, 0x67, 0x65, 0x62, + 0x4B, 0x5B, 0x5F, 0x53, 0x56, 0x52, 0x4F, 0x46, + 0x42, 0x0B, 0x69, 0x66, 0x64, 0x57, 0x4A, 0x4E, + 0x55, 0x4B, 0x46, 0x3B, 0x30, 0x33, 0x00, 0x2B, + 0x37, 0x3E, 0x32, 0x33, 0x25, 0x2C, 0x29, 0x0D, + 0x1D, 0x14, 0x06, 0x02, 0x00 +}; + +unsigned char linux_logo_blue[] __initdata = { + 0xF3, 0xF6, 0xF8, 0xF7, 0xEF, 0xEE, 0xE5, 0xDE, + 0xD7, 0xD3, 0xDD, 0xC8, 0xC7, 0xC4, 0xC2, 0xB5, + 0xB0, 0xA6, 0xAC, 0x9B, 0xB5, 0xB5, 0xAE, 0x84, + 0x90, 0xA9, 0x81, 0x8D, 0x96, 0x86, 0xB0, 0xB6, + 0xBB, 0xBE, 0xB9, 0xB8, 0xB3, 0xB2, 0xA7, 0xAD, + 0xAC, 0xA9, 0xA8, 0xA6, 0xA4, 0xA1, 0xA5, 0x87, + 0xA0, 0x9F, 0x9E, 0x9C, 0x9B, 0x9A, 0x9A, 0x99, + 0x98, 0x95, 0x96, 0x94, 0x93, 0x92, 0x8F, 0x8D, + 0x8C, 0x8A, 0x87, 0x86, 0x83, 0x81, 0xC8, 0xD7, + 0x9B, 0x8E, 0x8C, 0xB2, 0x77, 0x77, 0x4E, 0x77, + 0x69, 0x71, 0x78, 0x6B, 0x65, 0x66, 0x64, 0x59, + 0x5C, 0x5A, 0x48, 0x72, 0x7B, 0x6B, 0x67, 0x6E, + 0x42, 0x5B, 0x29, 0x36, 0x25, 0x10, 0x17, 0x14, + 0x19, 0x16, 0x13, 0x0E, 0x08, 0x2E, 0x2E, 0x3D, + 0x24, 0x24, 0x24, 0x24, 0x13, 0x12, 0x14, 0x14, + 0x0E, 0x08, 0x0D, 0x0F, 0x08, 0x0D, 0x0E, 0x08, + 0x08, 0x0C, 0x06, 0x06, 0x07, 0x16, 0x07, 0x0E, + 0x08, 0x0A, 0x07, 0x0D, 0x2D, 0x3E, 0x09, 0x4E, + 0x68, 0x52, 0x56, 0x58, 0x4B, 0x22, 0x20, 0x20, + 0x27, 0x39, 0x28, 0x19, 0x1E, 0x1E, 0x08, 0x06, + 0x07, 0x09, 0x08, 0x08, 0x05, 0x1D, 0x1F, 0x17, + 0x18, 0x06, 0x79, 0x80, 0x7D, 0x7C, 0x7A, 0x78, + 0x76, 0x71, 0x73, 0x6E, 0x6B, 0x68, 0x65, 0x62, + 0x4B, 0x5B, 0x5F, 0x55, 0x56, 0x52, 0x4F, 0x46, + 0x42, 0x5A, 0x14, 0x23, 0x3D, 0x2B, 0x21, 0x14, + 0x06, 0x04, 0x03, 0x07, 0x09, 0x13, 0x2A, 0x3A, + 0x37, 0x3E, 0x32, 0x33, 0x25, 0x2C, 0x07, 0x09, + 0x1D, 0x14, 0x06, 0x02, 0x00 +}; + +unsigned char linux_logo[] __initdata = { + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x58, 0x57, + 0x58, 0x58, 0x59, 0x5C, 0x5D, 0x5F, 0x60, 0x61, + 0x62, 0x61, 0x61, 0x62, 0x62, 0x62, 0x63, 0x63, + 0x61, 0x61, 0x61, 0x61, 0x61, 0x60, 0x5E, 0x5E, + 0x5E, 0x5D, 0x5D, 0x5C, 0x5D, 0x5B, 0x58, 0x58, + 0x58, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x58, + 0x57, 0x57, 0x58, 0x57, 0x57, 0x58, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x58, 0x57, + 0x54, 0x56, 0x57, 0x67, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0x67, 0x4C, + 0x4A, 0x49, 0x4A, 0x49, 0x4A, 0x49, 0x49, 0x4A, + 0x4A, 0x4B, 0x4B, 0x4B, 0x4C, 0x50, 0x51, 0x52, + 0x54, 0x54, 0x56, 0x57, 0x57, 0x57, 0x57, 0x58, + 0x57, 0x57, 0x58, 0x57, 0x57, 0x58, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x58, 0x56, 0x56, 0x53, + 0x52, 0x53, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFB, 0xFB, 0xFB, + 0x4B, 0x4B, 0x4B, 0x4A, 0x49, 0x4A, 0x4A, 0x49, + 0x49, 0x49, 0x48, 0x49, 0x49, 0x4A, 0x4A, 0x4B, + 0x4C, 0x4D, 0x52, 0x54, 0x56, 0x55, 0x57, 0x58, + 0x57, 0x57, 0x58, 0x57, 0x57, 0x58, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x55, 0x54, 0x53, 0x52, 0x51, 0x50, + 0x50, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xF8, 0xF0, 0xF4, 0xFB, + 0xFC, 0x67, 0x53, 0x50, 0x4D, 0x4C, 0x4C, 0x4C, + 0x4B, 0x4A, 0x4A, 0x48, 0x49, 0x48, 0x48, 0x49, + 0x49, 0x49, 0x4B, 0x4C, 0x50, 0x52, 0x53, 0x56, + 0x57, 0x57, 0x58, 0x57, 0x57, 0x58, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x55, 0x54, 0x53, 0x51, 0x51, 0x50, 0x4C, 0x4D, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xF4, 0xD2, 0xD7, 0xF5, + 0xFC, 0xFC, 0x5D, 0x5D, 0x5C, 0x5C, 0x59, 0x58, + 0x58, 0x56, 0x52, 0x4C, 0x4B, 0x4A, 0x4A, 0x48, + 0x48, 0x48, 0x48, 0x48, 0x49, 0x4B, 0x4D, 0x51, + 0x54, 0x56, 0x58, 0x57, 0x57, 0x58, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x58, 0x57, 0x57, 0x57, 0x55, 0x54, + 0x53, 0x52, 0x51, 0x4D, 0x4D, 0x4D, 0x50, 0x50, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xF4, 0x64, 0xD9, 0xF5, + 0xF9, 0xFC, 0xFC, 0x64, 0x63, 0x62, 0x61, 0x61, + 0x61, 0x60, 0x5E, 0x5B, 0x5A, 0x54, 0x52, 0x4C, + 0x4B, 0x49, 0x49, 0x47, 0x47, 0x48, 0x49, 0x4B, + 0x4C, 0x51, 0x53, 0x56, 0x57, 0x58, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x58, 0x57, 0x57, 0x55, 0x53, 0x53, + 0x51, 0x50, 0x50, 0x50, 0x50, 0x50, 0x53, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xF4, 0xF5, 0xF9, 0xFC, + 0xFC, 0xFC, 0xFC, 0x64, 0x64, 0x64, 0x64, 0x64, + 0x64, 0x64, 0x64, 0x63, 0x61, 0x61, 0x5E, 0x59, + 0x55, 0x52, 0x4C, 0x4A, 0x49, 0x47, 0x48, 0x48, + 0x49, 0x4B, 0x4D, 0x51, 0x54, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x58, 0x55, 0x54, 0x54, 0x52, 0x51, + 0x51, 0x51, 0x51, 0x51, 0x53, 0x54, 0x59, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xF7, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0x60, 0x60, 0x60, 0x61, + 0x62, 0x63, 0x64, 0x64, 0x65, 0x65, 0x64, 0x63, + 0x61, 0x5E, 0x59, 0x56, 0x4D, 0x4B, 0x48, 0x48, + 0x48, 0x48, 0x49, 0x4B, 0x50, 0x53, 0x56, 0x56, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x56, 0x54, 0x53, 0x52, 0x51, 0x51, + 0x51, 0x52, 0x53, 0x55, 0x59, 0x5D, 0x5E, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFB, 0xFB, 0xFB, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0x4C, 0x4E, 0x51, 0x52, + 0x57, 0x5A, 0x5E, 0x60, 0x61, 0x63, 0x65, 0xCB, + 0x64, 0x64, 0x63, 0x60, 0x5C, 0x57, 0x50, 0x4B, + 0x48, 0x47, 0x47, 0x47, 0x4A, 0x4C, 0x52, 0x53, + 0x54, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x55, 0x54, 0x53, 0x53, 0x51, 0x52, 0x52, 0x53, + 0x53, 0x57, 0x5A, 0x5D, 0x5E, 0x5E, 0x60, 0xFC, + 0xFC, 0xFC, 0xFB, 0xF9, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFA, 0xF9, 0xF5, 0xFB, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFB, 0x45, 0x3F, 0x3F, + 0x45, 0x48, 0x4B, 0x4D, 0x54, 0x5A, 0x5E, 0x61, + 0x63, 0xCB, 0xCB, 0x65, 0x64, 0x62, 0x5E, 0x57, + 0x50, 0x4B, 0x48, 0x47, 0x47, 0x48, 0x4B, 0x4D, + 0x51, 0x56, 0x56, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x55, + 0x54, 0x54, 0x53, 0x53, 0x52, 0x53, 0x54, 0x57, + 0x59, 0x5C, 0x5E, 0x5E, 0x5E, 0x5E, 0x5E, 0xFC, + 0xFC, 0xFA, 0xFC, 0xFA, 0xE0, 0xFC, 0xFC, 0xFC, + 0xFB, 0xFB, 0xFB, 0xDF, 0xD8, 0xF9, 0xE0, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFB, 0x4C, 0x4A, 0x48, + 0x48, 0x3E, 0x44, 0x43, 0x3F, 0x47, 0x4B, 0x52, + 0x5A, 0x5E, 0x62, 0x64, 0xCB, 0xCB, 0x64, 0x61, + 0x5E, 0x57, 0x4D, 0x49, 0x47, 0x47, 0x48, 0x4A, + 0x4C, 0x52, 0x54, 0x56, 0x57, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x55, + 0x54, 0x53, 0x53, 0x54, 0x54, 0x55, 0x58, 0x5B, + 0x5C, 0x5D, 0x5E, 0x5D, 0x5D, 0x5B, 0x58, 0xFC, + 0xFC, 0xD8, 0x4C, 0x60, 0xFC, 0xF5, 0xFC, 0xFC, + 0xFC, 0xF7, 0x5F, 0x48, 0x48, 0x2C, 0xF8, 0xF9, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0x4B, 0x4A, 0x49, + 0x49, 0x49, 0x49, 0x47, 0x3E, 0x44, 0x42, 0x3F, + 0x3E, 0x4B, 0x54, 0x5C, 0x61, 0x64, 0xCB, 0xCB, + 0x64, 0x61, 0x5D, 0x53, 0x4B, 0x49, 0x47, 0x47, + 0x49, 0x4B, 0x50, 0x53, 0x56, 0x57, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x57, 0x55, 0x55, 0x54, + 0x53, 0x53, 0x54, 0x56, 0x58, 0x5A, 0x5B, 0x5D, + 0x5D, 0x5D, 0x5C, 0x5A, 0x54, 0x52, 0x4C, 0xFC, + 0xF7, 0x4E, 0x2D, 0x29, 0x4E, 0xFC, 0xFC, 0xFC, + 0xFB, 0x5F, 0x26, 0x24, 0x20, 0x2E, 0x65, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0x45, 0x3F, 0x45, + 0x3E, 0x47, 0x47, 0x47, 0x47, 0x47, 0x3E, 0x44, + 0x43, 0x40, 0x44, 0x49, 0x51, 0x5C, 0x62, 0x64, + 0xCB, 0xCB, 0x63, 0x60, 0x58, 0x50, 0x49, 0x48, + 0x48, 0x48, 0x4A, 0x4D, 0x53, 0x54, 0x57, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x55, 0x54, 0x54, 0x54, + 0x54, 0x54, 0x55, 0x57, 0x59, 0x5B, 0x5C, 0x5D, + 0x5C, 0x5A, 0x54, 0x51, 0x4C, 0x4C, 0x54, 0xFC, + 0xF9, 0x23, 0xDB, 0x2D, 0x23, 0xFA, 0xFB, 0xFA, + 0xF5, 0x27, 0x21, 0xD9, 0xF8, 0x20, 0x21, 0xFB, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0x5D, 0x58, 0x55, + 0x50, 0x48, 0x45, 0x43, 0x44, 0x44, 0x45, 0x45, + 0x3E, 0x3F, 0x43, 0x41, 0x3F, 0x48, 0x52, 0x5D, + 0x63, 0x65, 0xCB, 0x65, 0x61, 0x5D, 0x52, 0x4B, + 0x48, 0x47, 0x47, 0x49, 0x4C, 0x51, 0x54, 0x57, + 0x57, 0x57, 0x57, 0x57, 0x55, 0x54, 0x54, 0x54, + 0x54, 0x58, 0x5A, 0x59, 0x5B, 0x5B, 0x5B, 0x5A, + 0x55, 0x52, 0x4D, 0x4D, 0x55, 0x5B, 0x5D, 0xFC, + 0xF1, 0xF9, 0xFC, 0xD4, 0x21, 0xCC, 0xF7, 0xF8, + 0xF2, 0x21, 0xD9, 0xFC, 0xF2, 0xFB, 0x21, 0x45, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFB, 0xD1, 0xD0, 0xCD, + 0xCC, 0x63, 0x5E, 0x58, 0x50, 0x47, 0x43, 0x3F, + 0x3F, 0x3F, 0x3F, 0x3F, 0x40, 0x41, 0x3F, 0x4A, + 0x56, 0x5E, 0x64, 0xCB, 0x65, 0x63, 0x5E, 0x56, + 0x4C, 0x48, 0x47, 0x47, 0x49, 0x4C, 0x51, 0x54, + 0x58, 0x57, 0x57, 0x57, 0x57, 0x55, 0x54, 0x54, + 0x57, 0x5A, 0x5A, 0x5C, 0x5B, 0x5A, 0x58, 0x54, + 0x51, 0x4C, 0x55, 0x5D, 0x5D, 0x5B, 0x54, 0xFC, + 0xF0, 0xF9, 0xFC, 0x65, 0x45, 0xCD, 0xFB, 0xFB, + 0xF8, 0x26, 0xFB, 0xFC, 0xFC, 0xFC, 0x21, 0x27, + 0xFB, 0xFC, 0xFC, 0xFC, 0xFB, 0xD7, 0x35, 0x34, + 0x2F, 0x35, 0x36, 0x2F, 0x2F, 0x36, 0x2F, 0x2F, + 0x36, 0x36, 0x35, 0x35, 0x43, 0x42, 0x41, 0x2E, + 0x45, 0x4C, 0x5B, 0x62, 0x65, 0xCC, 0x64, 0x60, + 0x58, 0x4D, 0x49, 0x47, 0x47, 0x49, 0x4C, 0x51, + 0x58, 0x57, 0x57, 0x57, 0x57, 0x57, 0x55, 0x57, + 0x58, 0x5A, 0x5A, 0x5B, 0x5A, 0x55, 0x54, 0x51, + 0x53, 0x5C, 0x5D, 0x5D, 0x54, 0x4B, 0x4D, 0xFC, + 0xFC, 0x44, 0xFC, 0xFB, 0x7B, 0xAB, 0xA8, 0xAE, + 0xAB, 0x7F, 0xFC, 0xFC, 0xFB, 0xFB, 0x22, 0x2A, + 0xFC, 0xFC, 0xFC, 0xFC, 0x36, 0x2F, 0x30, 0x30, + 0x32, 0x30, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x2F, 0x2F, 0x40, 0x41, + 0x2E, 0x40, 0x48, 0x56, 0x5F, 0x64, 0xCC, 0x65, + 0x61, 0x59, 0x50, 0x49, 0x47, 0x47, 0x49, 0x4C, + 0x5A, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x58, + 0x5A, 0x5A, 0x5A, 0x58, 0x55, 0x52, 0x51, 0x5A, + 0x5D, 0x5D, 0x57, 0x4C, 0x51, 0x54, 0x5D, 0xFC, + 0xFC, 0x2A, 0xFC, 0xC9, 0xAA, 0x8B, 0x8A, 0x8C, + 0xAB, 0x8C, 0x8C, 0xFB, 0xFB, 0x23, 0x20, 0xF1, + 0xFC, 0xFC, 0xFC, 0x3B, 0x33, 0x33, 0x32, 0x32, + 0x31, 0x32, 0x30, 0x32, 0x32, 0x32, 0x32, 0x30, + 0x31, 0x31, 0x31, 0x32, 0x33, 0x33, 0x3C, 0x41, + 0x41, 0x2E, 0x2D, 0x45, 0x4D, 0x5D, 0x63, 0xCC, + 0x65, 0x62, 0x5D, 0x51, 0x49, 0x47, 0x47, 0x4A, + 0x59, 0x57, 0x57, 0x57, 0x57, 0x58, 0x58, 0x58, + 0x5A, 0x5A, 0x58, 0x55, 0x53, 0x53, 0x5C, 0x5E, + 0x59, 0x51, 0x4E, 0x54, 0x59, 0x5E, 0x62, 0xFC, + 0xFC, 0xDB, 0xAA, 0xA1, 0x95, 0x9C, 0x8C, 0x88, + 0x82, 0x83, 0x83, 0x8C, 0x88, 0xAE, 0xB9, 0xFB, + 0xFC, 0xFC, 0xFC, 0x3C, 0x3B, 0x72, 0x38, 0x33, + 0x33, 0x33, 0x31, 0x33, 0x31, 0x31, 0x31, 0x31, + 0x33, 0x33, 0x38, 0x33, 0x72, 0x3B, 0x44, 0x2E, + 0x41, 0x2E, 0x2E, 0x2D, 0x43, 0x4B, 0x5B, 0x63, + 0xCB, 0xCC, 0x63, 0x5D, 0x51, 0x49, 0x47, 0x49, + 0x5C, 0x58, 0x57, 0x57, 0x57, 0x57, 0x58, 0x58, + 0x58, 0x58, 0x57, 0x53, 0x58, 0x5D, 0x5E, 0x55, + 0x51, 0x53, 0x58, 0x5E, 0x60, 0x63, 0x64, 0xFC, + 0xFC, 0xC0, 0xA6, 0x9D, 0x8B, 0x9C, 0x8C, 0x8C, + 0x6E, 0x83, 0x88, 0x8C, 0x8C, 0x8C, 0x83, 0xE8, + 0xFB, 0xFC, 0xFC, 0xFC, 0x33, 0x70, 0x70, 0x6F, + 0x6F, 0x6F, 0x6F, 0x3A, 0x6F, 0x6D, 0x6F, 0x6F, + 0x70, 0x6F, 0x6F, 0x70, 0x6F, 0x32, 0x5A, 0x48, + 0x41, 0x2D, 0x2D, 0x2D, 0x2C, 0x41, 0x49, 0x5A, + 0x62, 0xCB, 0xCB, 0x63, 0x5D, 0x50, 0x49, 0x4A, + 0x5C, 0x58, 0x58, 0x57, 0x55, 0x57, 0x57, 0x57, + 0x57, 0x55, 0x56, 0x59, 0x5E, 0x5C, 0x52, 0x53, + 0x55, 0x5B, 0x5E, 0x61, 0x63, 0x64, 0x63, 0xFC, + 0xE8, 0xBF, 0xA4, 0x99, 0x9C, 0x8C, 0x88, 0x88, + 0x6E, 0x88, 0x8C, 0x8C, 0x8C, 0xC2, 0xA6, 0xC4, + 0xFC, 0xFC, 0xFC, 0xFC, 0x36, 0x3A, 0x6F, 0x70, + 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, + 0x70, 0x70, 0x70, 0x70, 0x37, 0x32, 0xCD, 0x5E, + 0x4C, 0x43, 0x2C, 0x2D, 0x2D, 0x2C, 0x2E, 0x47, + 0x57, 0x61, 0x65, 0xCC, 0x63, 0x5C, 0x50, 0x4D, + 0x5C, 0x5A, 0x57, 0x55, 0x55, 0x55, 0x58, 0x58, + 0x55, 0x54, 0x5B, 0x5E, 0x5D, 0x53, 0x53, 0x55, + 0x5D, 0x5E, 0x61, 0x61, 0x61, 0x61, 0x5E, 0xFC, + 0xEA, 0xBE, 0xA4, 0x9B, 0x8B, 0x85, 0x8C, 0x6E, + 0x8C, 0x8C, 0x8C, 0xA3, 0xAA, 0xA4, 0xA4, 0xE9, + 0xFB, 0xFC, 0xFC, 0xFC, 0x36, 0x6D, 0x70, 0x73, + 0x70, 0x70, 0x70, 0x73, 0x73, 0x73, 0x73, 0x70, + 0x70, 0x70, 0x73, 0x70, 0x37, 0x38, 0xD1, 0xCF, + 0x61, 0x4D, 0x44, 0x2C, 0x2D, 0x2E, 0x2C, 0x2E, + 0x3E, 0x56, 0x61, 0xCB, 0xCC, 0x62, 0x5B, 0x57, + 0x59, 0x58, 0x55, 0x54, 0x54, 0x55, 0x58, 0x58, + 0x58, 0x5B, 0x5E, 0x5B, 0x53, 0x55, 0x55, 0x5C, + 0x5E, 0x61, 0x61, 0x60, 0x5D, 0x5A, 0x4E, 0xFC, + 0xFC, 0xEA, 0xAA, 0x9C, 0x8A, 0x85, 0x82, 0x8C, + 0x8C, 0xA8, 0xEB, 0xA8, 0xA4, 0xA4, 0xAA, 0xFC, + 0xFC, 0xFC, 0x64, 0xFB, 0x39, 0x31, 0x72, 0x78, + 0x73, 0x78, 0x73, 0x74, 0x74, 0x74, 0x74, 0x73, + 0x78, 0x70, 0x73, 0x73, 0x33, 0xCC, 0xD2, 0xD1, + 0xCE, 0x62, 0x53, 0x3F, 0x2D, 0x2D, 0x41, 0x2C, + 0x2E, 0x3E, 0x56, 0x62, 0xCB, 0xCB, 0x61, 0x5D, + 0x54, 0x54, 0x54, 0x54, 0x56, 0x58, 0x58, 0x58, + 0x5C, 0x5E, 0x5A, 0x55, 0x58, 0x58, 0x5B, 0x5E, + 0x61, 0x5E, 0x5D, 0x5A, 0x52, 0x55, 0xCD, 0xFC, + 0xFC, 0x34, 0xC9, 0xE8, 0xA8, 0xAE, 0xC2, 0xE8, + 0xC3, 0xA6, 0xA7, 0xA6, 0xAA, 0x78, 0x2E, 0x42, + 0xFC, 0xFC, 0xD2, 0x64, 0xF8, 0x31, 0x72, 0x73, + 0x73, 0x73, 0x73, 0x74, 0x75, 0x75, 0x74, 0x73, + 0x73, 0x73, 0x73, 0x72, 0x33, 0x5C, 0x64, 0xD2, + 0xD1, 0xCF, 0x63, 0x54, 0x3F, 0x2C, 0x41, 0x41, + 0x2C, 0x2E, 0x47, 0x58, 0x63, 0xCB, 0xCB, 0x62, + 0x52, 0x53, 0x53, 0x56, 0x58, 0x58, 0x5A, 0x5B, + 0x5E, 0x5A, 0x57, 0x58, 0x58, 0x58, 0x60, 0x60, + 0x5D, 0x5A, 0x55, 0x4E, 0x64, 0xD2, 0xD1, 0xFC, + 0xFC, 0x41, 0x3E, 0xC1, 0xC0, 0xA3, 0xA6, 0xA7, + 0xA7, 0xA9, 0xAA, 0xB8, 0x2E, 0x3F, 0x2C, 0x41, + 0xFC, 0xFC, 0xF7, 0xCE, 0xCD, 0x36, 0x72, 0x73, + 0x74, 0x75, 0x78, 0x75, 0x75, 0x75, 0x74, 0x74, + 0x74, 0x74, 0x78, 0x72, 0x6D, 0x49, 0x59, 0xCB, + 0xD1, 0xD1, 0xD2, 0xCB, 0x56, 0x3F, 0x2C, 0x41, + 0x40, 0x2D, 0x2E, 0x49, 0x5B, 0x64, 0xCC, 0x64, + 0x51, 0x53, 0x53, 0x55, 0x58, 0x59, 0x5B, 0x5E, + 0x59, 0x58, 0x58, 0x58, 0x55, 0x60, 0x60, 0x5C, + 0x5A, 0x53, 0x5B, 0xD0, 0xD3, 0xD3, 0xD3, 0xFB, + 0xFC, 0x40, 0x41, 0x45, 0xC4, 0xC0, 0xBE, 0xBE, + 0xC1, 0xC0, 0x3C, 0x47, 0x2E, 0x21, 0x22, 0x20, + 0x65, 0xFC, 0xFC, 0xFC, 0xFC, 0x6D, 0x72, 0x75, + 0x78, 0x76, 0x75, 0x79, 0x76, 0x76, 0x76, 0x76, + 0x75, 0x75, 0x75, 0x72, 0x6D, 0x2E, 0x48, 0x5D, + 0xCE, 0xD1, 0xD4, 0xD3, 0xCB, 0x56, 0x43, 0x2C, + 0x42, 0x43, 0x2E, 0x2E, 0x4A, 0x5D, 0x64, 0x64, + 0x50, 0x52, 0x56, 0x58, 0x5C, 0x5D, 0x5E, 0x5D, + 0x5A, 0x58, 0x58, 0x55, 0x61, 0x60, 0x58, 0x58, + 0x4E, 0x61, 0xD1, 0xD4, 0xD4, 0xD1, 0xEE, 0xFC, + 0xFC, 0x2B, 0x29, 0x2E, 0x3F, 0xB0, 0xAD, 0x81, + 0x46, 0x2D, 0x46, 0x2C, 0x24, 0x22, 0x22, 0x23, + 0x25, 0xFC, 0xFC, 0xFC, 0xFC, 0x6E, 0x73, 0x76, + 0x76, 0x79, 0x79, 0x79, 0x76, 0x76, 0x79, 0x76, + 0x79, 0x79, 0x79, 0x74, 0x3F, 0x41, 0x2C, 0x48, + 0x5F, 0xCF, 0xD5, 0xD7, 0xD6, 0xCD, 0x57, 0x40, + 0x2E, 0x3F, 0x44, 0x2E, 0x41, 0x4C, 0x60, 0x61, + 0x51, 0x53, 0x58, 0x5C, 0x5D, 0x5E, 0x5D, 0x5C, + 0x58, 0x57, 0x54, 0x5F, 0x5E, 0x55, 0x55, 0x52, + 0x64, 0xD4, 0xD5, 0xD4, 0xD1, 0x5D, 0xFA, 0xFB, + 0xF4, 0x21, 0x24, 0x41, 0x40, 0x44, 0x2E, 0x2E, + 0x42, 0x41, 0x2A, 0x24, 0x22, 0x22, 0x22, 0x22, + 0x23, 0xD9, 0xFC, 0xFC, 0xFC, 0xFC, 0xE5, 0xB8, + 0x8F, 0x8F, 0x7A, 0x8F, 0x7A, 0x8F, 0x7A, 0x8F, + 0x8F, 0x8F, 0xB8, 0xE5, 0x3F, 0x3E, 0x43, 0x2C, + 0x48, 0x61, 0xD1, 0xD7, 0xD9, 0xD7, 0xD0, 0x57, + 0x41, 0x2E, 0x3E, 0x44, 0x2D, 0x40, 0x52, 0x5D, + 0x53, 0x55, 0x59, 0x5D, 0x5E, 0x5E, 0x5D, 0x5A, + 0x57, 0x53, 0x5E, 0x5E, 0x54, 0x53, 0x54, 0x65, + 0xD5, 0xD6, 0xD4, 0xCE, 0x53, 0xFB, 0xF9, 0xFC, + 0x24, 0x22, 0x23, 0x23, 0x41, 0x42, 0x2E, 0x40, + 0x2B, 0x21, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x23, 0x23, 0xFC, 0xFC, 0xFC, 0xFC, 0xE7, 0xBD, + 0xB5, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, + 0x93, 0xB5, 0xC6, 0xEB, 0x2D, 0x47, 0x4A, 0x47, + 0x2C, 0x3E, 0x61, 0xD4, 0xDC, 0xDC, 0xDA, 0xCF, + 0x54, 0x41, 0x41, 0x3E, 0x45, 0x2C, 0x3F, 0x4A, + 0x58, 0x5A, 0x5C, 0x5F, 0x60, 0x5E, 0x5D, 0x57, + 0x51, 0x5D, 0x5D, 0x51, 0x53, 0x53, 0xCB, 0xD5, + 0xD6, 0xD5, 0x63, 0x55, 0xFC, 0xFC, 0xFC, 0x2C, + 0x23, 0x22, 0x23, 0x22, 0x20, 0x2D, 0x2C, 0x26, + 0x21, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x21, 0xF0, 0xFC, 0xFC, 0xFC, 0xE2, 0xC6, + 0xB5, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, + 0x93, 0x93, 0xC7, 0xE3, 0x3E, 0x2E, 0x49, 0x52, + 0x4C, 0x41, 0x44, 0x62, 0xD6, 0xDE, 0xDE, 0xD9, + 0xD0, 0x51, 0x2E, 0x40, 0x47, 0x44, 0x2C, 0x42, + 0x5D, 0x5D, 0x5F, 0x60, 0x60, 0x5D, 0x57, 0x51, + 0x58, 0x5D, 0x4E, 0x52, 0x55, 0x64, 0xD5, 0xD6, + 0xD4, 0x61, 0x59, 0x6B, 0xFC, 0xFC, 0xFC, 0x21, + 0x23, 0x22, 0x23, 0x22, 0x23, 0x21, 0x23, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x21, 0x24, 0xFC, 0xFC, 0xFC, 0xE2, 0xC7, + 0xB5, 0x90, 0x93, 0x93, 0x93, 0x90, 0x93, 0x93, + 0x90, 0xB5, 0xC8, 0xE4, 0x5F, 0x45, 0x2E, 0x4D, + 0x57, 0x57, 0x44, 0x43, 0x63, 0xDA, 0xDF, 0xDF, + 0xD9, 0xCE, 0x4C, 0x2C, 0x3F, 0x3E, 0x40, 0x40, + 0x60, 0x5E, 0x61, 0x61, 0x5E, 0x5B, 0x53, 0x52, + 0x5C, 0x52, 0x52, 0x55, 0x61, 0xD4, 0xD5, 0xD1, + 0x5E, 0x5B, 0x5C, 0xFB, 0xFC, 0xFC, 0x2A, 0x21, + 0x23, 0x22, 0x23, 0x22, 0x22, 0x22, 0x23, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0xFB, 0xFC, 0xFC, 0xB3, 0xC8, + 0xB5, 0x90, 0x92, 0xB5, 0x93, 0x93, 0xB5, 0x93, + 0x92, 0xB5, 0xC8, 0xB9, 0xD0, 0x5E, 0x44, 0x40, + 0x52, 0x58, 0x57, 0x48, 0x40, 0x63, 0xD9, 0xE0, + 0xE0, 0xD9, 0xCB, 0x49, 0x2D, 0x3F, 0x45, 0x3F, + 0x63, 0x61, 0x62, 0x60, 0x5E, 0x55, 0x4D, 0x59, + 0x53, 0x4E, 0x54, 0x5D, 0xD2, 0xD4, 0xD2, 0x5E, + 0x5C, 0x5D, 0xFC, 0xFC, 0xFC, 0xF8, 0x29, 0x23, + 0x23, 0x23, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x23, 0x22, 0x22, 0x23, 0x23, 0x23, 0x22, 0x22, + 0x22, 0x22, 0x22, 0xF0, 0xFC, 0xFC, 0xB3, 0xC7, + 0xB5, 0x93, 0xB5, 0x93, 0x93, 0x91, 0x93, 0x93, + 0x91, 0xB5, 0xC7, 0xAD, 0xD6, 0xD2, 0x5E, 0x3F, + 0x3F, 0x57, 0x57, 0x58, 0x4A, 0x41, 0x64, 0xDC, + 0xF1, 0xDF, 0xDA, 0x61, 0x45, 0x2E, 0x43, 0x47, + 0xCB, 0x63, 0x62, 0x5F, 0x58, 0x51, 0x53, 0x54, + 0x4C, 0x52, 0x5C, 0xCD, 0xD3, 0xD2, 0x60, 0x5D, + 0x5D, 0xFB, 0xFC, 0xFC, 0xFC, 0xDB, 0x49, 0x24, + 0x21, 0x23, 0x23, 0x22, 0x26, 0x26, 0x2A, 0x24, + 0x22, 0x23, 0x22, 0x21, 0x24, 0x26, 0x26, 0x2A, + 0x29, 0x2B, 0x24, 0x25, 0xFC, 0xFC, 0xB3, 0xC5, + 0x91, 0x91, 0x92, 0x91, 0x92, 0x92, 0x93, 0x93, + 0x91, 0x93, 0xC6, 0xAD, 0xDC, 0xD9, 0xD4, 0x60, + 0x43, 0x45, 0x58, 0x58, 0x57, 0x4B, 0x43, 0xCC, + 0xDD, 0xF1, 0xD8, 0xD5, 0x5D, 0x43, 0x41, 0x47, + 0xCD, 0x63, 0x62, 0x5D, 0x54, 0x4C, 0x55, 0x4B, + 0x51, 0x58, 0x62, 0xD0, 0xD0, 0x62, 0x5D, 0x5D, + 0x67, 0xFC, 0xFC, 0xFC, 0xFC, 0x58, 0x4E, 0x28, + 0x2A, 0x20, 0x23, 0x22, 0x23, 0x2A, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x23, 0x25, 0x2A, 0x2E, 0x2D, + 0x2E, 0x2E, 0x2E, 0x23, 0xFA, 0xFC, 0xB2, 0xBD, + 0xB5, 0x90, 0x91, 0x93, 0x92, 0x90, 0x91, 0x93, + 0x92, 0x91, 0xBD, 0xAD, 0xDE, 0xE0, 0xD8, 0xD7, + 0x61, 0x40, 0x48, 0x58, 0x58, 0x58, 0x48, 0x44, + 0xCF, 0xDE, 0xE0, 0xDD, 0xD0, 0x52, 0x41, 0x45, + 0xCD, 0x63, 0x61, 0x58, 0x4D, 0x51, 0x4C, 0x4B, + 0x54, 0x5D, 0xCC, 0xCE, 0x63, 0x61, 0x5D, 0x5D, + 0xFB, 0xFC, 0xFC, 0xFC, 0xFC, 0x4B, 0x27, 0x21, + 0x22, 0x22, 0x23, 0x22, 0x22, 0x24, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x20, + 0x27, 0x2B, 0x41, 0x2B, 0x23, 0xFC, 0xB2, 0xB6, + 0x93, 0x90, 0x92, 0xB5, 0x92, 0x90, 0xB5, 0x90, + 0x92, 0x93, 0xBC, 0xAD, 0xDC, 0xF1, 0xF3, 0xF0, + 0xD9, 0x61, 0x41, 0x4A, 0x58, 0x57, 0x57, 0x44, + 0x49, 0xD2, 0xDD, 0xD8, 0xDA, 0x63, 0x4A, 0x45, + 0xCC, 0x63, 0x5E, 0x52, 0x4B, 0x4C, 0x49, 0x51, + 0x5C, 0x61, 0xCD, 0x65, 0x63, 0x5E, 0x4E, 0xCF, + 0xFB, 0xFB, 0xF0, 0xFC, 0xD2, 0x2A, 0x22, 0x23, + 0x22, 0x22, 0x23, 0x22, 0x22, 0x21, 0x22, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x23, 0x22, 0x26, 0x41, 0x27, 0xF9, 0x81, 0xB7, + 0xB5, 0x91, 0x92, 0xB5, 0x91, 0xB5, 0x93, 0xB5, + 0x93, 0xB6, 0xB7, 0xB9, 0xCB, 0xD8, 0xF3, 0xF2, + 0xF2, 0xDB, 0x61, 0x2D, 0x51, 0x58, 0x57, 0x58, + 0x41, 0x51, 0xD4, 0xDB, 0xDC, 0xD1, 0x5B, 0x4C, + 0xCB, 0x62, 0x59, 0x4C, 0x4A, 0x49, 0x4B, 0x55, + 0x60, 0x64, 0xCC, 0x64, 0x5E, 0x55, 0x60, 0xE1, + 0xFB, 0xF8, 0xFC, 0xFC, 0x21, 0x22, 0x22, 0x23, + 0x22, 0x22, 0x23, 0x22, 0x22, 0x21, 0x22, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x23, 0x22, 0x21, 0x24, 0x2D, 0x21, 0xB4, 0xBB, + 0xB6, 0xB5, 0xB6, 0xB7, 0xB7, 0xB7, 0xB7, 0xB6, + 0xB6, 0xB6, 0xBB, 0xB9, 0x45, 0xCB, 0xDF, 0xF3, + 0xF3, 0xF3, 0xDB, 0x5E, 0x2C, 0x51, 0x58, 0x58, + 0x52, 0x2D, 0x5C, 0xD4, 0xD9, 0xD5, 0x63, 0x58, + 0x64, 0x60, 0x53, 0x49, 0x4A, 0x49, 0x52, 0x5C, + 0x63, 0xCD, 0xCD, 0x63, 0x5C, 0x4E, 0x65, 0xFC, + 0xFC, 0xF5, 0xFC, 0xD2, 0x23, 0x22, 0x22, 0x23, + 0x22, 0x22, 0x23, 0x22, 0x22, 0x21, 0x22, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x23, 0x22, 0x21, 0x22, 0x25, 0x29, 0xB3, 0xC7, + 0xB5, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, 0xB6, + 0xB6, 0xB5, 0xC7, 0xAD, 0x57, 0x3F, 0xCB, 0xF0, + 0xF3, 0xF3, 0xF2, 0xD9, 0x58, 0x41, 0x4C, 0x58, + 0x57, 0x47, 0x42, 0x62, 0xD4, 0xD4, 0xCC, 0x60, + 0x63, 0x5D, 0x50, 0x47, 0x48, 0x4B, 0x58, 0x60, + 0xCC, 0xCE, 0xCD, 0x60, 0x53, 0x5C, 0x62, 0xFB, + 0xF9, 0xFC, 0xFC, 0x21, 0x23, 0x22, 0x22, 0x23, + 0x22, 0x22, 0x23, 0x23, 0x23, 0x21, 0x22, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, 0x81, 0xC7, + 0xB7, 0xB7, 0xBC, 0xB7, 0xBC, 0xBC, 0xBC, 0xB7, + 0xB7, 0xB7, 0xC8, 0x80, 0x58, 0x57, 0x40, 0xCE, + 0xF3, 0xF2, 0xF2, 0xF0, 0xD5, 0x4C, 0x3F, 0x4B, + 0x52, 0x50, 0x2D, 0x4B, 0x64, 0xD2, 0xCC, 0x61, + 0x60, 0x58, 0x4A, 0x47, 0x47, 0x4C, 0x59, 0x64, + 0xD0, 0xD0, 0x64, 0x59, 0x49, 0x5D, 0xFB, 0xFC, + 0xD9, 0xFC, 0xD6, 0x23, 0x22, 0x22, 0x22, 0x23, + 0x22, 0x22, 0x23, 0x23, 0x21, 0x21, 0x22, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, 0xB4, 0xC8, + 0xBD, 0xB7, 0xBD, 0xBC, 0xBD, 0xC5, 0xBC, 0xC5, + 0xBC, 0xBD, 0xC7, 0xAC, 0x58, 0x57, 0x58, 0x2C, + 0xD1, 0xF0, 0xF3, 0xF3, 0xE0, 0xCD, 0x45, 0x3E, + 0x48, 0x4B, 0x3F, 0x41, 0x56, 0x64, 0x65, 0x62, + 0x5D, 0x52, 0x47, 0x48, 0x48, 0x53, 0x60, 0xCC, + 0xD2, 0xD0, 0x63, 0x52, 0x4E, 0x53, 0xFB, 0xFB, + 0xFC, 0xFC, 0x23, 0x23, 0x22, 0x23, 0x22, 0x23, + 0x22, 0x22, 0x23, 0x23, 0x20, 0x21, 0x22, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x23, 0x22, 0x23, 0x22, 0x23, 0x22, 0xB4, 0xC7, + 0xC5, 0xBC, 0xC5, 0xBD, 0xC5, 0xC5, 0xBD, 0xC5, + 0xBC, 0xC6, 0xC7, 0xB9, 0x58, 0x57, 0x58, 0x57, + 0x2D, 0xD4, 0xF1, 0xF2, 0xF0, 0xD9, 0x5D, 0x47, + 0x48, 0x3F, 0x42, 0x2C, 0x48, 0x5C, 0x5F, 0x60, + 0x58, 0x50, 0x47, 0x4A, 0x49, 0x55, 0x63, 0xD0, + 0xD2, 0xCD, 0x5D, 0x49, 0x4E, 0xE1, 0xFC, 0xF0, + 0xFC, 0xF8, 0x22, 0x22, 0x22, 0x23, 0x22, 0x23, + 0x22, 0x22, 0x23, 0x20, 0x21, 0x21, 0x22, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x23, 0x22, + 0x23, 0x22, 0x23, 0x23, 0x23, 0x22, 0xC4, 0xC8, + 0xBD, 0xBD, 0xC6, 0xBD, 0xC6, 0xC6, 0xC5, 0xC6, + 0xBD, 0xC6, 0xC7, 0xE4, 0x54, 0x57, 0x58, 0x57, + 0x57, 0x43, 0xD7, 0xE0, 0xF1, 0xD8, 0xCD, 0x4B, + 0x4A, 0x47, 0x42, 0x2C, 0x3F, 0x4D, 0x58, 0x5C, + 0x52, 0x4B, 0x48, 0x4B, 0x4A, 0x58, 0xCB, 0xD3, + 0xD2, 0xCD, 0x58, 0x47, 0x4A, 0xFC, 0xFC, 0xFB, + 0xFC, 0x2B, 0x22, 0x22, 0x22, 0x23, 0x22, 0x23, + 0x22, 0x22, 0x23, 0x26, 0x21, 0x21, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, + 0x22, 0x23, 0x22, 0x23, 0x22, 0x23, 0xE5, 0xC8, + 0xBA, 0xC5, 0xC6, 0xC6, 0xC6, 0xC7, 0xC6, 0xC7, + 0xC5, 0xC6, 0xC8, 0xE5, 0x2E, 0x54, 0x58, 0x57, + 0x57, 0x4C, 0x4D, 0xDA, 0xD8, 0xD8, 0xD4, 0x5C, + 0x4B, 0x4B, 0x3F, 0x42, 0x44, 0x4A, 0x51, 0x58, + 0x4B, 0x48, 0x4B, 0x51, 0x4D, 0x5F, 0xD0, 0xD1, + 0xD0, 0x64, 0x51, 0x44, 0x6B, 0xFC, 0xFB, 0xFC, + 0xFC, 0x21, 0x23, 0x22, 0x22, 0x23, 0x22, 0x23, + 0x22, 0x22, 0x23, 0x26, 0x21, 0x23, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, + 0x22, 0x23, 0x22, 0x23, 0x23, 0x23, 0xE5, 0xED, + 0xE7, 0xBA, 0xC8, 0xC6, 0xC6, 0xC6, 0xC6, 0xC7, + 0xC7, 0xE5, 0xED, 0xE6, 0x61, 0x41, 0x52, 0x58, + 0x58, 0x57, 0x45, 0x5E, 0xD7, 0xDD, 0xD5, 0x60, + 0x4B, 0x4C, 0x48, 0x4D, 0x4D, 0x50, 0x4D, 0x56, + 0x4A, 0x3E, 0x53, 0x53, 0x52, 0x63, 0xD3, 0xD0, + 0xCE, 0x60, 0x4A, 0x45, 0xFC, 0xFC, 0xF7, 0xFC, + 0xFC, 0x21, 0x23, 0x23, 0x22, 0x23, 0x22, 0x23, + 0x22, 0x23, 0x21, 0x2A, 0x20, 0x23, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x23, 0x22, 0x23, 0x22, 0x21, 0x23, 0xEB, 0xF6, + 0xF6, 0xED, 0xED, 0xED, 0xED, 0xED, 0xED, 0xED, + 0xF6, 0xF6, 0xF6, 0xE6, 0xDB, 0x58, 0x45, 0x4B, + 0x58, 0x57, 0x4D, 0x4B, 0x64, 0xD4, 0xD0, 0x5C, + 0x48, 0x51, 0x4C, 0x5D, 0x5E, 0x5C, 0x56, 0x59, + 0x3E, 0x4A, 0x58, 0x54, 0x52, 0x65, 0xD3, 0xD0, + 0xCF, 0x5D, 0x48, 0xFC, 0xFC, 0xFC, 0xFA, 0xFC, + 0xFC, 0x21, 0x22, 0x23, 0x22, 0x23, 0x22, 0x23, + 0x22, 0x23, 0x21, 0x2A, 0x21, 0x23, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x23, 0x22, 0x23, 0x22, 0x21, 0x4F, 0xE6, 0xC6, + 0xC6, 0xBD, 0xC6, 0xBD, 0xBD, 0xBD, 0xBD, 0xC6, + 0xC5, 0xBA, 0xC7, 0xE6, 0xF2, 0xD4, 0x49, 0x4B, + 0x3E, 0x4D, 0x52, 0x3E, 0x52, 0x63, 0x64, 0x56, + 0x48, 0x54, 0x4D, 0x61, 0xCC, 0xCC, 0x60, 0x60, + 0x47, 0x4D, 0x5C, 0x53, 0x58, 0xCF, 0xD1, 0xCF, + 0xD0, 0x59, 0x45, 0xFC, 0xFC, 0xFC, 0xEF, 0xF9, + 0xFC, 0x21, 0x23, 0x22, 0x23, 0x22, 0x23, 0x22, + 0x23, 0x22, 0x23, 0x2A, 0x21, 0x23, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x23, 0x22, 0x23, 0x22, 0x23, 0x4F, 0xE4, 0xB9, + 0xAF, 0x80, 0x80, 0x8E, 0x8E, 0x8E, 0x8E, 0x8F, + 0x80, 0xB4, 0xB9, 0xE4, 0x7F, 0xDE, 0x61, 0x52, + 0x54, 0x48, 0x3F, 0x43, 0x4D, 0x56, 0x59, 0x4B, + 0x3E, 0x58, 0x53, 0x61, 0xD3, 0xD4, 0xCF, 0xCD, + 0x4C, 0x58, 0x5F, 0x53, 0x5E, 0xD3, 0xD0, 0xCE, + 0xCE, 0x52, 0x3F, 0xFC, 0xFC, 0xFC, 0xF7, 0x65, + 0xFA, 0x22, 0x23, 0x22, 0x23, 0x22, 0x23, 0x22, + 0x23, 0x22, 0x21, 0x2A, 0x23, 0x23, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x23, 0x22, 0x23, 0x22, 0x21, 0xB1, 0xE4, 0xE6, + 0x7C, 0xB1, 0x7C, 0xB1, 0xB2, 0xB2, 0xB3, 0x3D, + 0xB3, 0x3C, 0xE5, 0xB3, 0xB0, 0xF1, 0xD0, 0x58, + 0x5D, 0x4D, 0x40, 0x41, 0x48, 0x51, 0x4C, 0x3F, + 0x3F, 0x4D, 0x5A, 0x5A, 0xD5, 0xD9, 0xD7, 0xD4, + 0x57, 0x5E, 0x61, 0x4C, 0x63, 0xD4, 0xCF, 0xCE, + 0xCB, 0x4D, 0x4A, 0xFC, 0xFC, 0xFC, 0xFC, 0xF0, + 0xFB, 0x22, 0x23, 0x22, 0x23, 0x22, 0x23, 0x22, + 0x23, 0x22, 0x23, 0x2A, 0x21, 0x23, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x22, 0x23, 0x22, 0x23, 0x23, 0xB1, 0x81, 0x7D, + 0x39, 0x35, 0x35, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x7C, 0xB2, 0xB0, 0xDF, 0xD2, 0x57, + 0x60, 0x59, 0x5B, 0x59, 0x52, 0x4C, 0x4A, 0x40, + 0x42, 0x4A, 0x53, 0x4D, 0xD2, 0xDE, 0xDE, 0xD9, + 0x5E, 0x5E, 0x60, 0x4A, 0xCD, 0xD1, 0xCF, 0xCE, + 0x63, 0x49, 0x5C, 0xFB, 0xE8, 0x89, 0x9F, 0xFC, + 0xD6, 0x21, 0x21, 0x23, 0x22, 0x22, 0x23, 0x22, + 0x23, 0x22, 0x21, 0x2A, 0x22, 0x23, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x7F, 0xB9, + 0x71, 0x6C, 0x38, 0x38, 0x33, 0x33, 0x33, 0x38, + 0x38, 0x71, 0xAD, 0xE4, 0xD3, 0xDA, 0xCC, 0x52, + 0x63, 0x60, 0xCE, 0xD4, 0xCF, 0x60, 0x4C, 0x40, + 0x3F, 0x45, 0x4B, 0x5A, 0xCB, 0xD8, 0xDE, 0xDC, + 0x5E, 0x5E, 0x5F, 0x4C, 0xD2, 0xD2, 0xCF, 0xCF, + 0x61, 0x45, 0x5E, 0xA7, 0x9D, 0x95, 0x8B, 0x99, + 0xFC, 0x41, 0x21, 0x23, 0x23, 0x22, 0x23, 0x22, + 0x23, 0x22, 0x23, 0x2A, 0x23, 0x23, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x77, 0x77, 0xF6, + 0xFC, 0x7D, 0x7D, 0x7E, 0x7E, 0x7E, 0x7E, 0x7D, + 0x7D, 0xFC, 0x47, 0x64, 0xD0, 0xD0, 0x5D, 0x4B, + 0x62, 0xCC, 0xD1, 0xDE, 0xDE, 0xD4, 0x5E, 0x43, + 0x3F, 0x3E, 0x48, 0x53, 0x58, 0xDB, 0xD8, 0xDC, + 0x5E, 0x5E, 0x5E, 0x53, 0xD4, 0xD2, 0xD0, 0xD0, + 0x5E, 0x49, 0xA7, 0xA6, 0x89, 0x95, 0x8B, 0x9C, + 0x9C, 0xFB, 0xD4, 0x22, 0x22, 0x22, 0x22, 0x23, + 0x22, 0x23, 0x23, 0x2A, 0x22, 0x23, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, + 0x23, 0x22, 0x23, 0x23, 0x98, 0x8C, 0x8C, 0x88, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xF8, + 0xE9, 0x9C, 0x48, 0x5C, 0xD0, 0xCB, 0x48, 0x49, + 0x5B, 0xCB, 0xCD, 0xE0, 0xF1, 0xDD, 0xD0, 0x4A, + 0x41, 0x47, 0x45, 0x4C, 0x48, 0xD7, 0xDE, 0xDC, + 0x5E, 0x5E, 0x5A, 0x58, 0xD1, 0xD0, 0xD0, 0xD2, + 0x5C, 0x55, 0xA7, 0xA6, 0x87, 0x86, 0x89, 0x94, + 0x9C, 0xA9, 0xFC, 0xF4, 0x22, 0x23, 0x22, 0x23, + 0x22, 0x23, 0x22, 0x2A, 0x21, 0x23, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, + 0x22, 0x23, 0x22, 0x23, 0xA4, 0x89, 0x8C, 0xAA, + 0xFB, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xF7, + 0x85, 0x88, 0x8D, 0x59, 0x64, 0x63, 0x47, 0x3E, + 0x4C, 0x60, 0x61, 0xE0, 0xF0, 0xDF, 0xD9, 0x5D, + 0x2E, 0x3E, 0x3E, 0x47, 0x4D, 0xCD, 0xDE, 0xDC, + 0x5D, 0x5C, 0x51, 0x5D, 0xD1, 0xD2, 0xD2, 0xD4, + 0x5A, 0xBE, 0xA7, 0x98, 0x8A, 0x8A, 0xA0, 0x8B, + 0x86, 0x86, 0xF7, 0xFC, 0xF7, 0x26, 0x23, 0x23, + 0x22, 0x22, 0x22, 0x22, 0x21, 0x22, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, + 0x22, 0x21, 0x21, 0x21, 0xA1, 0x98, 0x9F, 0xBF, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xA7, + 0x8C, 0x86, 0x8D, 0x59, 0x5E, 0x5D, 0x3F, 0x3E, + 0x47, 0x53, 0x63, 0xD9, 0xF0, 0xF1, 0xDE, 0xD0, + 0x43, 0x3E, 0x47, 0x45, 0x4A, 0x5B, 0xDC, 0xDA, + 0x5D, 0x59, 0x49, 0x5F, 0xD1, 0xD2, 0xD3, 0xB9, + 0xA5, 0xA7, 0x98, 0x9B, 0x96, 0x9D, 0x89, 0x89, + 0x8B, 0x9C, 0x9D, 0xFC, 0xFC, 0xFC, 0x26, 0x22, + 0x23, 0x23, 0x22, 0x22, 0x21, 0x22, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, + 0x22, 0x22, 0x29, 0x2D, 0x99, 0x99, 0xA2, 0xAA, + 0xC4, 0xFB, 0xFC, 0xFC, 0xFC, 0xF6, 0xBF, 0xA2, + 0x9C, 0x9C, 0x8E, 0xDC, 0xCD, 0x51, 0x41, 0x3E, + 0x45, 0x49, 0x58, 0xCD, 0xE0, 0xE0, 0xD8, 0xDA, + 0x4C, 0x4A, 0x45, 0x45, 0x48, 0x47, 0xDA, 0xDA, + 0x5C, 0x58, 0x44, 0x69, 0xA9, 0x98, 0xA4, 0xA6, + 0xA1, 0xA4, 0x99, 0x9E, 0x9D, 0x8B, 0x8A, 0x97, + 0x87, 0x9A, 0x8A, 0xC2, 0xFC, 0xFC, 0xFC, 0x4D, + 0x21, 0x21, 0x23, 0x22, 0x21, 0x22, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x23, 0x22, + 0x21, 0x22, 0x2D, 0x34, 0xA4, 0xA2, 0xA2, 0xA9, + 0xBF, 0xC0, 0xC3, 0xC1, 0xC0, 0xBE, 0xA6, 0x9D, + 0x99, 0x87, 0xA2, 0xF1, 0xDC, 0x64, 0x42, 0x45, + 0x47, 0x3E, 0x49, 0x4C, 0xDD, 0xDF, 0xD8, 0xDB, + 0x5E, 0x4C, 0x48, 0x45, 0x45, 0x41, 0xD1, 0xD6, + 0x5A, 0x55, 0x3F, 0xA7, 0xA1, 0x98, 0x9F, 0x99, + 0x9F, 0x9D, 0x9A, 0x95, 0x8B, 0x97, 0x89, 0x8A, + 0x88, 0x94, 0x9C, 0x8C, 0xFC, 0xFC, 0xFC, 0xFC, + 0xF4, 0x21, 0x23, 0x22, 0x21, 0x22, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x22, 0x23, + 0x23, 0x23, 0x2C, 0x2C, 0xA8, 0xA2, 0xA4, 0xA4, + 0xA9, 0xAA, 0xAA, 0xAA, 0xA9, 0xA6, 0x98, 0x9C, + 0x8B, 0x88, 0x98, 0x8D, 0xD8, 0xD6, 0x4E, 0x47, + 0x47, 0x49, 0x47, 0x3F, 0xDA, 0xDD, 0xDE, 0xDD, + 0xCC, 0x4A, 0x4B, 0x3E, 0x45, 0x43, 0x61, 0xD4, + 0x56, 0x51, 0x44, 0xA4, 0x9B, 0x8B, 0x9C, 0x9A, + 0xA0, 0xA2, 0x98, 0x98, 0x8B, 0x8B, 0x98, 0x98, + 0x84, 0x8B, 0x94, 0x8A, 0xA4, 0xFC, 0xFC, 0xFC, + 0xFC, 0xF2, 0x21, 0x22, 0x21, 0x22, 0x23, 0x22, + 0x22, 0x22, 0x23, 0x22, 0x23, 0x23, 0x23, 0x23, + 0x23, 0x22, 0x2C, 0x2D, 0xC0, 0xA4, 0xA2, 0xA4, + 0xA4, 0xA6, 0xA6, 0xA6, 0xA4, 0xA2, 0x9F, 0x89, + 0x8B, 0x9C, 0x9C, 0x8B, 0x68, 0xDB, 0x5F, 0x4B, + 0x3E, 0x49, 0x4B, 0x3E, 0xCC, 0xDA, 0xDC, 0xDD, + 0xD3, 0x49, 0x52, 0x48, 0x45, 0x45, 0x53, 0xD0, + 0x51, 0x4A, 0x44, 0xA4, 0x9B, 0x8B, 0x9C, 0xA0, + 0x9B, 0x86, 0x89, 0x98, 0x89, 0x8A, 0x96, 0x8A, + 0x9C, 0x89, 0x89, 0x9C, 0x8C, 0xF6, 0xFC, 0xFC, + 0xFC, 0xFC, 0x21, 0x22, 0x21, 0x22, 0x23, 0x22, + 0x22, 0x22, 0x22, 0x23, 0x22, 0x21, 0x22, 0x23, + 0x22, 0x21, 0x2B, 0x34, 0xC0, 0xA8, 0xA4, 0xA2, + 0xA2, 0x98, 0xA1, 0xA0, 0x98, 0x9F, 0x95, 0x8A, + 0x94, 0xA1, 0x8A, 0x84, 0x9B, 0x68, 0xCC, 0x49, + 0x4A, 0x47, 0x4C, 0x4B, 0x51, 0xD3, 0xDA, 0xDC, + 0xD5, 0x56, 0x56, 0x4A, 0x3E, 0x45, 0x48, 0x63, + 0x4A, 0x47, 0x3E, 0xA7, 0x98, 0x9D, 0x9E, 0x8B, + 0x95, 0x9B, 0x89, 0x86, 0x9B, 0x8B, 0x89, 0x84, + 0x9A, 0xA1, 0x95, 0x9A, 0x8C, 0xA4, 0xFC, 0xFC, + 0xFC, 0xFA, 0x23, 0x22, 0x21, 0x22, 0x23, 0x22, + 0x22, 0x22, 0x22, 0x23, 0x22, 0x21, 0x22, 0x23, + 0x21, 0x23, 0x2C, 0xF6, 0xBF, 0xA9, 0xA2, 0x99, + 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9B, 0x87, 0x8B, + 0x9C, 0x86, 0x9C, 0x8A, 0x87, 0x87, 0x89, 0x51, + 0x54, 0x47, 0x4B, 0x50, 0x4B, 0xCF, 0xD6, 0xDC, + 0xD5, 0x60, 0x54, 0x52, 0x48, 0x45, 0x40, 0x5A, + 0x45, 0x43, 0x47, 0xA7, 0x98, 0x9B, 0x95, 0x95, + 0x9A, 0x87, 0x98, 0x98, 0x8A, 0x86, 0x87, 0x9E, + 0x9B, 0x95, 0x9D, 0x9D, 0x99, 0x85, 0xA6, 0xFA, + 0xF2, 0x21, 0x23, 0x22, 0x21, 0x22, 0x23, 0x22, + 0x22, 0x22, 0x22, 0x23, 0x22, 0x21, 0x22, 0x22, + 0x21, 0x24, 0xFB, 0xF7, 0xBF, 0xA6, 0xA2, 0x99, + 0x97, 0x89, 0x86, 0x89, 0x9C, 0x96, 0x9E, 0x94, + 0x89, 0x99, 0x98, 0x89, 0x9E, 0x9B, 0x89, 0x8B, + 0x58, 0x4B, 0x4A, 0x52, 0x48, 0xCC, 0xD3, 0xDA, + 0xD3, 0x65, 0x4C, 0x58, 0x49, 0x3E, 0x2E, 0x4D, + 0x40, 0x41, 0x45, 0xA9, 0xA1, 0x9B, 0x9E, 0x9C, + 0x95, 0x8A, 0x94, 0x89, 0x96, 0x87, 0x9C, 0x9A, + 0x84, 0x9D, 0x9C, 0x9E, 0x9A, 0x9C, 0x9D, 0xBB, + 0x23, 0x23, 0x22, 0x22, 0x21, 0x22, 0x23, 0x22, + 0x22, 0x22, 0x22, 0x23, 0x22, 0x21, 0x23, 0x23, + 0x24, 0xFC, 0xFC, 0xF6, 0xBF, 0xA6, 0x9F, 0x99, + 0x89, 0x95, 0x87, 0x94, 0x9D, 0x9E, 0x97, 0x9E, + 0x95, 0x9B, 0x89, 0x95, 0x95, 0x9B, 0x89, 0x87, + 0x5D, 0x56, 0x3E, 0x51, 0x3E, 0x60, 0xCF, 0xD3, + 0xD2, 0xCD, 0x5C, 0x49, 0x4B, 0x3E, 0x2C, 0x48, + 0x3E, 0x43, 0x3E, 0xA9, 0xA1, 0x9B, 0x97, 0x94, + 0x95, 0x9A, 0x9C, 0x87, 0x87, 0x9B, 0x9C, 0x95, + 0x9D, 0x89, 0x9A, 0x89, 0x9E, 0x9E, 0x8C, 0xA6, + 0x20, 0x23, 0x23, 0x22, 0x23, 0x22, 0x23, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x21, 0x21, 0x20, 0x40, + 0xFC, 0xFC, 0xFC, 0xEC, 0xBE, 0xA4, 0x9F, 0x99, + 0x95, 0x9F, 0xA0, 0x88, 0x9D, 0x8B, 0x97, 0x95, + 0x87, 0x95, 0x96, 0x95, 0x97, 0x94, 0x94, 0x98, + 0xD3, 0x4C, 0x47, 0x4D, 0x42, 0x4C, 0x60, 0xCC, + 0xCE, 0xD0, 0x65, 0x4B, 0x47, 0x44, 0x2B, 0x45, + 0x4B, 0x47, 0x49, 0xA7, 0xA1, 0x9A, 0x97, 0x89, + 0x95, 0x97, 0x97, 0x9E, 0x89, 0x95, 0x89, 0x9C, + 0x87, 0x95, 0x97, 0x99, 0x95, 0x99, 0x9F, 0xA4, + 0xC4, 0x21, 0x21, 0x23, 0x21, 0x23, 0x23, 0x23, + 0x23, 0x23, 0x23, 0x23, 0x21, 0x20, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xEA, 0xAA, 0xA6, 0xA2, 0x99, + 0x8B, 0x9A, 0x95, 0x9E, 0x9E, 0x9A, 0x94, 0x87, + 0x94, 0x94, 0x89, 0x94, 0x9B, 0x9B, 0xA7, 0xDC, + 0xDB, 0x65, 0x2E, 0x3E, 0x43, 0x44, 0x49, 0x58, + 0x63, 0xD3, 0xD3, 0x5E, 0x42, 0x42, 0x2D, 0x40, + 0x54, 0x4C, 0x4A, 0xA7, 0xA0, 0x99, 0x9B, 0x94, + 0xA0, 0x8A, 0x9B, 0x9D, 0x87, 0x95, 0x94, 0x8B, + 0x8A, 0x98, 0x9C, 0x8A, 0x9B, 0x99, 0xA2, 0xA6, + 0xBF, 0xEC, 0x2A, 0x20, 0x21, 0x23, 0x21, 0x20, + 0x20, 0x20, 0x20, 0x4C, 0xF9, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xEB, 0xAA, 0xA4, 0x9F, 0x9C, + 0x8B, 0x9B, 0x88, 0x84, 0x9E, 0x9D, 0x96, 0x94, + 0x94, 0x9A, 0x9B, 0x9B, 0xA4, 0xD5, 0xCD, 0xDE, + 0xF1, 0xDA, 0x4C, 0x2D, 0x41, 0x2B, 0x42, 0x4C, + 0x5E, 0xD4, 0xD7, 0xCD, 0x49, 0x2E, 0x2E, 0x41, + 0x5E, 0x57, 0xA7, 0xA6, 0xA7, 0xA4, 0xA2, 0x98, + 0x9D, 0x9C, 0xA1, 0x99, 0x9D, 0x88, 0x8B, 0x9C, + 0x8A, 0x9C, 0x9C, 0x94, 0x9C, 0x89, 0xA0, 0xA6, + 0xAA, 0xEB, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFB, 0xE9, 0xAA, 0xA6, 0xA2, 0x8B, + 0x8B, 0x8A, 0x86, 0x9B, 0x9C, 0x98, 0xA0, 0x9B, + 0x9B, 0x84, 0xA7, 0xB4, 0x61, 0xD1, 0xD2, 0xE0, + 0xF1, 0xDC, 0x61, 0x2D, 0x2E, 0x3F, 0x56, 0x62, + 0x5D, 0xD4, 0xD9, 0xD3, 0x54, 0x41, 0x41, 0x44, + 0xCB, 0x60, 0x52, 0xA9, 0xA9, 0xA9, 0xA7, 0xA6, + 0xA6, 0xA4, 0xA4, 0xA2, 0xA2, 0x9D, 0x95, 0x89, + 0x9C, 0x8A, 0x9E, 0x9C, 0x8A, 0x9E, 0xA0, 0xA8, + 0xC0, 0xE9, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xE9, 0xAA, 0xA6, 0xA0, 0x99, + 0x9C, 0x8B, 0x9A, 0x84, 0x9B, 0x9B, 0x98, 0x98, + 0xA9, 0xB9, 0x49, 0x57, 0xCB, 0xD4, 0xD3, 0xF1, + 0xD8, 0xDA, 0xCE, 0x3F, 0x41, 0x4B, 0x5D, 0xCB, + 0x5E, 0xD6, 0xDB, 0xD6, 0x5D, 0x43, 0x3F, 0x49, + 0xD1, 0xCC, 0x4F, 0xDD, 0xC3, 0xBB, 0xBF, 0xAA, + 0xAA, 0xA9, 0xAA, 0xA8, 0xA8, 0xA6, 0xA6, 0xA2, + 0x9C, 0x9F, 0x9B, 0x9A, 0x9D, 0xA2, 0xA8, 0xAA, + 0xC1, 0xEA, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xEA, 0xC0, 0xAA, 0xA6, 0xA2, + 0xA2, 0x99, 0xA0, 0xA0, 0xA4, 0xA7, 0xA9, 0xC0, + 0x67, 0x49, 0x54, 0x60, 0xD0, 0xD4, 0xCC, 0xDF, + 0xD9, 0xD5, 0xD2, 0x3E, 0x47, 0x56, 0x60, 0xCD, + 0x5D, 0xD9, 0xD9, 0xD6, 0x61, 0x3F, 0x47, 0x52, + 0xD6, 0xD3, 0x62, 0x4D, 0x40, 0x4A, 0x57, 0xCA, + 0xC3, 0xC1, 0xC1, 0xC0, 0xBF, 0xBF, 0xAA, 0xAA, + 0xA6, 0xA4, 0xA4, 0xA4, 0xA6, 0xA8, 0xBE, 0xC1, + 0xC9, 0xEB, 0xFB, 0xFB, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, + 0xFC, 0xFC, 0xFC, 0xEB, 0xC3, 0xC0, 0xAA, 0xA8, + 0xA6, 0xA6, 0xA6, 0xA9, 0xAA, 0xC0, 0xE8, 0xD0, + 0xD2, 0x4C, 0x5E, 0x64, 0xD0, 0xD1, 0x5F, 0xD9, + 0xD5, 0xD1, 0xD0, 0x48, 0x52, 0x5C, 0x64, 0xCD, + 0x5C, 0xDC, 0xD7, 0xD5, 0x62, 0x3F, 0x4C, 0x53, + 0xDA, 0xD7, 0xCE, 0x56, 0x40, 0x4B, 0x52, 0x56, + 0xCE, 0xDF, 0x6A, 0xEB, 0xE9, 0xC9, 0xC3, 0xC0, + 0xC0, 0xBF, 0xBE, 0xAA, 0xBF, 0xC0, 0xC3, 0xC9, + 0xEA, 0xF6, 0xEE, 0x58, 0x57, 0x5E, 0xD6, 0xD0, + 0xD2, 0x61, 0xCB, 0xD6, 0xD6, 0xD4, 0xDF, 0xF3, + 0xF2, 0xDD, 0xD7, 0xEB, 0xC9, 0xC1, 0xC0, 0xBF, + 0xAA, 0xAA, 0xAA, 0xBE, 0xC3, 0xF0, 0xD2, 0xD2, + 0xD2, 0x51, 0x62, 0xCC, 0xD0, 0xCC, 0x61, 0xD3, + 0xCF, 0xCE, 0xD2, 0x48, 0x5A, 0x61, 0xCC, 0xCE, + 0x5F, 0xD9, 0xD5, 0xD1, 0x63, 0x44, 0x56, 0x56, + 0xDC, 0xD9, 0xD4, 0x5E, 0x42, 0x4A, 0x4C, 0x57, + 0x5D, 0xD8, 0xE0, 0xD8, 0xDC, 0xCB, 0x66, 0xEC, + 0xE8, 0xC3, 0xC3, 0xC3, 0xC3, 0xC9, 0xE8, 0xEA, + 0xF6, 0x50, 0x3E, 0x58, 0x57, 0x5A, 0xD6, 0xD4, + 0xCC, 0x4B, 0x53, 0x5C, 0x64, 0xD1, 0xDF, 0xF3, + 0xF1, 0xDE, 0xD9, 0xF6, 0xEB, 0xC9, 0xC1, 0xC1, + 0xC0, 0xC0, 0xC1, 0xC9, 0xF0, 0xD6, 0xCD, 0xD6, + 0xD3, 0x53, 0xCB, 0xCF, 0xCD, 0x5F, 0x5F, 0xCE, + 0xCF, 0xCD, 0xD0, 0x47, 0x5F, 0xCB, 0xCE, 0xCD, + 0x63, 0xD6, 0xD3, 0xD1, 0x63, 0x3F, 0x58, 0x58, + 0xDB, 0xDC, 0xDA, 0x65, 0x3E, 0x49, 0x49, 0x4D, + 0x49, 0xDC, 0xDF, 0xE0, 0xDE, 0xD5, 0x47, 0x47, + 0x46, 0x6B, 0xEB, 0xEA, 0xE9, 0xEA, 0xEB, 0xF6, + 0xD0, 0x57, 0x57, 0x47, 0x47, 0x5B, 0xD4, 0xD4, + 0xCD, 0x44, 0x3E, 0x4B, 0x50, 0x4B, 0x51, 0xD5, + 0xDB, 0xD8, 0xDE, 0x4B, 0xF6, 0xF6, 0xEA, 0xE9, + 0xE8, 0xEA, 0xEB, 0x67, 0x5E, 0xCC, 0xD6, 0xDC, + 0xD5, 0x58, 0xCE, 0xCE, 0x62, 0x50, 0xCC, 0xD3, + 0xD2, 0xCD, 0xCD, 0x4B, 0x64, 0xCE, 0xCE, 0x64, + 0xCC, 0xD3, 0xD2, 0xD2, 0x61, 0x47, 0x5D, 0x5C, + 0xDD, 0xDD, 0xD9, 0xD1, 0x4C, 0x47, 0x49, 0x4A, + 0x4B, 0xD1, 0xD8, 0xE0, 0xDF, 0xDD, 0x5D, 0x4A, + 0x48, 0x52, 0x51, 0x3F, 0xF6, 0xEC, 0xE0, 0xE0, + 0xD3, 0x5E, 0x5F, 0x50, 0x4B, 0x50, 0xCB, 0xCE, + 0x64, 0x45, 0x4C, 0x57, 0x57, 0x58, 0x52, 0xD6, + 0xD3, 0xDE, 0xDF, 0xD1, 0x3E, 0x4B, 0xF6, 0xF6, + 0xEC, 0x66, 0x53, 0x43, 0x56, 0xD1, 0xD9, 0xDE, + 0xD4, 0x5E, 0xCE, 0xCC, 0x5B, 0x2C, 0xD4, 0xD5, + 0xD2, 0xD0, 0x63, 0x5D, 0xCD, 0xD0, 0xCD, 0x5E, + 0xD0, 0xCF, 0xCE, 0xD2, 0x5E, 0x50, 0x60, 0x5D, + 0xDE, 0xDD, 0xDC, 0xD7, 0x5D, 0x45, 0x47, 0x3E, + 0x4B, 0x5E, 0xDE, 0xDF, 0xE0, 0xD8, 0xCF, 0x3E, + 0x45, 0x51, 0x58, 0x42, 0xCB, 0xDA, 0xDE, 0xD8, + 0xD2, 0x61, 0xCC, 0xCF, 0xD6, 0xDA, 0xDA, 0xD5, + 0xD0, 0x50, 0x44, 0x57, 0x57, 0x58, 0x45, 0xD1, + 0xD1, 0xD7, 0xDF, 0xDF, 0xD7, 0xCF, 0x64, 0x60, + 0xCE, 0xCE, 0xCE, 0x63, 0xCF, 0xDA, 0xDE, 0xD9, + 0xCF, 0x63, 0xCD, 0x63, 0x4D, 0x4B, 0xD6, 0xD5, + 0xCE, 0xD3, 0x60, 0xCB, 0xD0, 0xD0, 0x65, 0x47, + 0xD0, 0xCC, 0xCC, 0xD1, 0x59, 0x5D, 0x63, 0x5E, + 0xDD, 0xDD, 0xDE, 0xDC, 0xCB, 0x40, 0x48, 0x45, + 0x3E, 0x3E, 0xD9, 0xDF, 0xE0, 0xDF, 0xDA, 0x51, + 0x4C, 0x48, 0x56, 0x4C, 0x5B, 0xD2, 0xDA, 0xDB, + 0xCB, 0x5F, 0xD0, 0xCC, 0xDC, 0xF0, 0xF3, 0xE0, + 0xDD, 0xCC, 0x41, 0x50, 0x57, 0x57, 0x4B, 0x5D, + 0xD3, 0xD1, 0xDE, 0xDF, 0xDE, 0xD7, 0xD0, 0xD0, + 0xD5, 0xD6, 0xD6, 0xCE, 0xD7, 0xDC, 0xDA, 0xD5, + 0x60, 0x63, 0x64, 0x5E, 0x47, 0x61, 0xD5, 0xD2, + 0xCF, 0xD0, 0x59, 0xCD, 0xD1, 0xCF, 0x61, 0x4D, + 0xCC, 0xCE, 0xCD, 0xD0, 0x52, 0x61, 0x64, 0x60, + 0xDA, 0xDE, 0xDE, 0xDD, 0xD1, 0x4B, 0x4A, 0x45, + 0x3E, 0x41, 0xCD, 0xDE, 0xE0, 0xF1, 0xDE, 0x63, + 0x4A, 0x4A, 0x4A, 0x4B, 0x50, 0xCB, 0xD4, 0xD7, + 0x5E, 0x54, 0x62, 0xD3, 0xD4, 0xF0, 0xF3, 0xF3, + 0xF2, 0xDE, 0x61, 0x40, 0x49, 0x56, 0x4D, 0x3E, + 0x4B, 0xCE, 0xD9, 0xD8, 0xD9, 0xD5, 0xCF, 0xD2, + 0xD6, 0xD6, 0xD1, 0xD1, 0xD7, 0xD5, 0xCF, 0xD0, + 0x54, 0x64, 0x63, 0x56, 0x2C, 0xCB, 0xD1, 0xCC, + 0xD3, 0xCD, 0x54, 0xCF, 0xD1, 0xCE, 0x5E, 0x5C, + 0xCE, 0xCE, 0xCE, 0xCB, 0x4B, 0x63, 0xCC, 0x61, + 0xD4, 0xDC, 0xDE, 0xDE, 0xDA, 0x5D, 0x45, 0x45, + 0x48, 0x3F, 0x52, 0xD9, 0xD8, 0xDF, 0xDF, 0xD2, + 0x52, 0x4B, 0x3E, 0x2E, 0x47, 0x60, 0xCF, 0xD3, + 0x59, 0x48, 0x50, 0x5E, 0xCC, 0xDE, 0xF2, 0xF2, + 0xF3, 0xF3, 0xDD, 0x5D, 0x3E, 0x48, 0x47, 0x47, + 0x58, 0xD1, 0xDA, 0xDA, 0xD5, 0xD1, 0xCD, 0xD2, + 0xD3, 0xCF, 0xD3, 0xD1, 0xCD, 0xD3, 0xD2, 0x5E, + 0x52, 0x64, 0x60, 0x4B, 0x45, 0x61, 0xCD, 0xD3, + 0xD3, 0x64, 0x61, 0xD0, 0xD0, 0x64, 0x45, 0x63, + 0xD0, 0xCE, 0xD0, 0x60, 0x56, 0xCB, 0xCC, 0x62, + 0xCE, 0xDA, 0xDE, 0xD8, 0xDD, 0xCC, 0x45, 0x49, + 0x3E, 0x47, 0x42, 0xD1, 0xDC, 0xD8, 0xD8, 0xD3, + 0x5D, 0x4C, 0x49, 0x3F, 0x47, 0x59, 0xCD, 0xCF, + 0x59, 0x2E, 0x48, 0x47, 0x52, 0x63, 0xF0, 0xF2, + 0xF3, 0xF3, 0xF2, 0xDA, 0x52, 0x4B, 0x52, 0x58, + 0x5E, 0x63, 0xD0, 0xD0, 0xD0, 0xCF, 0xCE, 0xCE, + 0xCF, 0x65, 0x61, 0xD6, 0xD6, 0xD6, 0xCB, 0x4B, + 0x61, 0x62, 0x5D, 0x43, 0x4B, 0x61, 0xD0, 0xD4, + 0xD1, 0x61, 0xCE, 0xD2, 0xCD, 0x5E, 0x4A, 0xCE, + 0xD0, 0xCC, 0xD0, 0x59, 0x61, 0xCC, 0xCC, 0x62, + 0xD1, 0xD5, 0xDE, 0xD8, 0xDD, 0xCF, 0x4B, 0x4A, + 0x45, 0x3E, 0x2D, 0xCB, 0xDC, 0xDE, 0xD8, 0xD5, + 0x60, 0x54, 0x51, 0x4C, 0x4D, 0x5C, 0xCC, 0xCE, + 0x5A, 0x2C, 0x50, 0x53, 0x3E, 0x59, 0xD8, 0xF3, + 0xF2, 0xF3, 0xF3, 0xE0, 0x5E, 0x4A, 0x4C, 0x53, + 0x5E, 0x63, 0xCC, 0xCC, 0xCC, 0xCD, 0xCF, 0xD3, + 0x62, 0x53, 0xD6, 0xD6, 0xD6, 0xD6, 0x5B, 0x48, + 0x64, 0x63, 0x59, 0x44, 0x57, 0x63, 0xD2, 0xD3, + 0xD0, 0x5E, 0xD0, 0xD1, 0xCB, 0x58, 0x4C, 0xCF, + 0xCF, 0xCE, 0xCE, 0x57, 0x63, 0xCC, 0xCD, 0x57, +}; + +unsigned char linux_logo_bw[] __initdata = { + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x3F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, + 0xFE, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFE, 0x3F, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xC7, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xC3, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, + 0xFB, 0xE3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFD, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xF1, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, + 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF9, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF9, 0xCF, 0xC3, 0xF8, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x87, 0x81, 0xF9, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xA7, + 0x99, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF9, 0xF3, 0xBC, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF9, 0xE3, 0xBC, 0xF9, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xB0, 0x3C, 0xF9, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xB0, + 0x19, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF9, 0xC0, 0x03, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF9, 0x80, 0x01, 0xF8, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x80, 0x01, 0xF8, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0x80, + 0x01, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF9, 0xC0, 0x21, 0xD8, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF9, 0xB1, 0x80, 0xEC, 0xC0, 0x1F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x90, 0x00, 0xE4, + 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x8C, + 0xC0, 0x7C, 0x04, 0x81, 0xFF, 0xFF, 0xFF, 0xFF, + 0xE3, 0x80, 0x00, 0x7C, 0x40, 0x11, 0xFF, 0xFF, + 0xFF, 0xFF, 0xE3, 0x80, 0x00, 0x7F, 0xD2, 0x29, + 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0x00, 0x00, 0x3F, + 0x80, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0x00, + 0x00, 0x3F, 0x80, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, + 0x1E, 0x00, 0x00, 0x1F, 0x80, 0x19, 0xFF, 0xFF, + 0xFF, 0xFE, 0x1C, 0x00, 0x00, 0x1E, 0x80, 0x19, + 0xFF, 0xFF, 0xFF, 0xFE, 0x3C, 0x00, 0x00, 0x1E, + 0x80, 0x11, 0xFF, 0xFF, 0xFF, 0xFC, 0x7C, 0x00, + 0x00, 0x0F, 0x80, 0x11, 0xFF, 0xFF, 0xFF, 0xFC, + 0xF8, 0x00, 0x00, 0x0E, 0x80, 0x11, 0xFF, 0xFF, + 0xFF, 0xFC, 0xF8, 0x00, 0x00, 0x06, 0x00, 0x11, + 0xFF, 0xFF, 0xFF, 0xF8, 0xF8, 0x00, 0x00, 0x06, + 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xF9, 0xF0, 0x00, + 0x00, 0x02, 0x00, 0x09, 0xFF, 0xFF, 0xFF, 0xF1, + 0xF0, 0x00, 0x00, 0x02, 0x80, 0x10, 0xFF, 0xFF, + 0xFF, 0xF1, 0xE0, 0x00, 0x00, 0x00, 0x97, 0x10, + 0xFF, 0xFF, 0xFF, 0xE3, 0xE0, 0x00, 0x00, 0x00, + 0xDF, 0xF0, 0xFF, 0xFF, 0xFF, 0xE3, 0xC0, 0x00, + 0x00, 0x00, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xC7, + 0xC0, 0x00, 0x00, 0x01, 0xFF, 0xF8, 0xFF, 0xFF, + 0xFF, 0xC7, 0x80, 0x00, 0x00, 0x01, 0xFF, 0xF8, + 0xFF, 0xFF, 0xFF, 0x8F, 0x80, 0x00, 0x00, 0x01, + 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0x8F, 0x80, 0x00, + 0x00, 0x01, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0x9F, + 0x80, 0x00, 0x00, 0x01, 0xFF, 0xF8, 0xFF, 0xFF, + 0xFF, 0x9F, 0x80, 0x00, 0x00, 0x01, 0x80, 0x18, + 0xFF, 0xFF, 0xFF, 0x9E, 0x80, 0x00, 0x00, 0x03, + 0xA8, 0x11, 0xFF, 0xFF, 0xFF, 0x9F, 0x80, 0x00, + 0x00, 0x02, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0x99, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x09, 0xFF, 0xFF, + 0xFF, 0x00, 0x80, 0x00, 0x00, 0x01, 0xC0, 0x01, + 0xFF, 0xFF, 0xFE, 0x20, 0x60, 0x00, 0x00, 0x00, + 0xFF, 0xC3, 0xFF, 0xFF, 0xF8, 0x00, 0x30, 0x00, + 0x00, 0x00, 0xFF, 0x0F, 0xFF, 0xFF, 0xC0, 0x40, + 0x38, 0x00, 0x00, 0x00, 0xFE, 0x47, 0xFF, 0xFF, + 0x81, 0x00, 0x1C, 0x00, 0x00, 0x00, 0xFC, 0x23, + 0xFF, 0xFF, 0x90, 0x00, 0x1E, 0x00, 0x00, 0x00, + 0x78, 0x11, 0xFF, 0xFF, 0x80, 0x00, 0x0F, 0x80, + 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0x80, 0x00, + 0x07, 0xC0, 0x00, 0x00, 0x00, 0x08, 0xFF, 0xFF, + 0xC0, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x04, + 0x7F, 0xFF, 0x80, 0x00, 0x03, 0xC0, 0x00, 0x10, + 0x00, 0x00, 0x1F, 0xFF, 0x80, 0x00, 0x01, 0x80, + 0x00, 0x30, 0x00, 0x00, 0x0F, 0xFF, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x70, 0x00, 0x01, 0x4F, 0xFF, + 0x80, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, + 0x0F, 0xFF, 0xC0, 0x00, 0x00, 0x80, 0x03, 0xF0, + 0x00, 0x00, 0x8F, 0xFF, 0x80, 0x00, 0x00, 0x40, + 0x0F, 0xF0, 0x00, 0x04, 0x1F, 0xFF, 0x80, 0x00, + 0x00, 0x7F, 0xFF, 0xF0, 0x00, 0x10, 0x1F, 0xFF, + 0xC0, 0x00, 0x00, 0x7F, 0xFF, 0xF0, 0x00, 0x40, + 0xFF, 0xFF, 0x98, 0x00, 0x00, 0xFF, 0xFF, 0xF0, + 0x00, 0x83, 0xFF, 0xFF, 0x81, 0xE0, 0x01, 0xFF, + 0xFF, 0xF8, 0x02, 0x07, 0xFF, 0xFF, 0x80, 0x3F, + 0x07, 0xE0, 0x00, 0x1C, 0x0C, 0x1F, 0xFF, 0xFF, + 0xF8, 0x03, 0xFF, 0x80, 0x00, 0x1F, 0x78, 0x1F, + 0xFF, 0xFF, 0xFF, 0x80, 0x7F, 0x00, 0x07, 0x0F, + 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, 0x0C, 0x07, + 0xFF, 0x83, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0x1F, 0xFF, 0xC0, 0x03, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x07, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +}; + +#endif + +#ifdef INCLUDE_LINUX_LOGO16 + +unsigned char linux_logo16_red[] __initdata = { + 0x00, 0x90, 0xb0, 0x9c, 0xf7, 0x35, 0x83, 0xa5, + 0x65, 0x8f, 0x98, 0xc9, 0xdb, 0xe1, 0xe7, 0xf8 +}; + +unsigned char linux_logo16_green[] __initdata = { + 0x00, 0x90, 0xb0, 0x9c, 0xf7, 0x2e, 0x83, 0xa5, + 0x65, 0x6e, 0x98, 0x89, 0xbf, 0xac, 0xda, 0xf8 +}; + +unsigned char linux_logo16_blue[] __initdata = { + 0x00, 0x90, 0xaf, 0x9c, 0xf7, 0x2b, 0x82, 0xa5, + 0x65, 0x41, 0x97, 0x1e, 0x60, 0x29, 0xa5, 0xf8 +}; + +unsigned char linux_logo16[] __initdata = { + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa1, 0x11, 0x11, + 0x61, 0x16, 0x66, 0x66, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x1a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0x33, 0xa8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x87, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x73, 0x33, 0x33, 0x3a, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xa3, 0x33, 0x33, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x27, 0x77, 0x77, 0x77, 0x33, 0x3a, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xa3, 0x33, 0x33, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x55, 0x50, 0x08, 0x33, 0x77, 0x77, + 0x77, 0x72, 0x72, 0x27, 0x77, 0x77, 0x33, 0x33, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xa3, 0x33, 0x33, 0x77, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x58, 0x85, 0x00, 0x11, 0x11, 0xaa, + 0xa3, 0x37, 0x77, 0x72, 0x22, 0x22, 0x77, 0x73, + 0x33, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa3, + 0x33, 0x37, 0x77, 0x33, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x56, 0x85, 0x00, 0x06, 0x66, 0x11, + 0x11, 0x1a, 0xa3, 0x37, 0x77, 0x72, 0x22, 0x77, + 0x73, 0x33, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x33, + 0x33, 0x33, 0x33, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x55, 0x00, 0x00, 0x06, 0x66, 0x66, + 0x66, 0x66, 0x11, 0x1a, 0xa3, 0x77, 0x72, 0x22, + 0x77, 0x73, 0x3a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x33, 0x33, + 0x33, 0x33, 0x33, 0xa0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, + 0x66, 0x66, 0x66, 0x66, 0x11, 0xa3, 0x77, 0x22, + 0x22, 0x77, 0x33, 0x33, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x33, 0x33, 0x33, + 0x33, 0x3a, 0xa1, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x33, + 0xaa, 0x11, 0x16, 0x66, 0x66, 0x61, 0x1a, 0x37, + 0x22, 0x22, 0x77, 0x33, 0x3a, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xa3, 0x33, 0x33, 0x33, + 0x3a, 0xa1, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x02, 0x22, + 0x22, 0x77, 0x3a, 0x11, 0x66, 0x66, 0x66, 0x1a, + 0x37, 0x22, 0x22, 0x77, 0x33, 0x3a, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0x33, 0x33, 0x33, 0x3a, + 0xa1, 0x11, 0x11, 0x10, 0x00, 0x00, 0x50, 0x00, + 0x00, 0x05, 0x80, 0x50, 0x00, 0x00, 0x07, 0x72, + 0x22, 0x22, 0x22, 0x73, 0xa1, 0x66, 0x66, 0x61, + 0x1a, 0x77, 0x22, 0x27, 0x73, 0x33, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0x33, 0x33, 0x3a, 0xaa, + 0x11, 0x11, 0x1a, 0xa0, 0x08, 0x71, 0x05, 0x00, + 0x00, 0x12, 0x22, 0x50, 0x00, 0x00, 0x07, 0x77, + 0x77, 0x72, 0x22, 0x22, 0x27, 0x31, 0x16, 0x66, + 0x61, 0x13, 0x77, 0x22, 0x77, 0x33, 0x3a, 0xaa, + 0xaa, 0xaa, 0xaa, 0xa3, 0x33, 0x33, 0xaa, 0xa1, + 0x11, 0x1a, 0x33, 0x70, 0x07, 0x2e, 0x70, 0x00, + 0x01, 0x44, 0x42, 0x60, 0x00, 0x00, 0x02, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x27, 0x31, 0x66, + 0x66, 0x61, 0xa3, 0x72, 0x22, 0x77, 0x33, 0xaa, + 0xaa, 0xaa, 0xa3, 0x33, 0x33, 0xaa, 0xaa, 0x11, + 0x1a, 0x33, 0x77, 0x30, 0x04, 0x82, 0x40, 0x00, + 0x54, 0x48, 0x54, 0x40, 0x00, 0x00, 0x01, 0xaa, + 0x32, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x31, + 0x66, 0x66, 0x11, 0x37, 0x22, 0x27, 0x73, 0x3a, + 0xaa, 0xaa, 0xa3, 0x33, 0x3a, 0xaa, 0xaa, 0xaa, + 0xa3, 0x77, 0xaa, 0x10, 0x50, 0x08, 0x46, 0x05, + 0x54, 0x80, 0x50, 0x42, 0x00, 0x00, 0x08, 0x66, + 0x66, 0x1a, 0x32, 0x22, 0x22, 0x22, 0x22, 0x27, + 0x31, 0x66, 0x66, 0x13, 0x72, 0x22, 0x77, 0x33, + 0xaa, 0xaa, 0xaa, 0x33, 0xaa, 0xa1, 0xaa, 0xa3, + 0x37, 0xa1, 0x1a, 0x30, 0x50, 0x06, 0x26, 0x00, + 0x54, 0x00, 0x00, 0x44, 0x00, 0x00, 0x08, 0xe2, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0x22, 0x22, + 0x27, 0xa6, 0x66, 0x61, 0xa7, 0x72, 0x27, 0x73, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x33, + 0x31, 0x11, 0x37, 0x70, 0x02, 0x00, 0xab, 0xbb, + 0xb6, 0x00, 0x00, 0xf4, 0x00, 0x00, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0x22, + 0x22, 0x23, 0x16, 0x66, 0x1a, 0x37, 0x22, 0x77, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa3, 0x3a, + 0x11, 0xa7, 0x33, 0x10, 0x04, 0x09, 0xbd, 0xdd, + 0xbd, 0xd0, 0x04, 0x45, 0x00, 0x0e, 0xee, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0x22, + 0x22, 0x22, 0x71, 0x66, 0x66, 0x13, 0x72, 0x27, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x33, 0x11, + 0xa3, 0x73, 0xa1, 0x60, 0x08, 0xbd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdb, 0x90, 0x00, 0x02, 0xec, 0xee, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xce, 0x22, + 0x22, 0x22, 0x27, 0xa6, 0x66, 0x61, 0x37, 0x27, + 0x1a, 0xaa, 0xaa, 0xaa, 0xaa, 0xa3, 0xa1, 0x1a, + 0x33, 0xa1, 0x16, 0x60, 0x0b, 0xbd, 0xdd, 0xdd, + 0xcd, 0xdd, 0xdd, 0xd9, 0x00, 0x00, 0xec, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xce, 0xa2, + 0x22, 0x22, 0x22, 0x7a, 0x66, 0x66, 0x13, 0x77, + 0x1a, 0xaa, 0xaa, 0xaa, 0xaa, 0x3a, 0x11, 0x33, + 0xaa, 0x11, 0x66, 0x60, 0x9b, 0xdd, 0xdd, 0xdd, + 0xcd, 0xdd, 0xdb, 0xb9, 0x00, 0x00, 0xec, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xee, 0x61, + 0x72, 0x22, 0x22, 0x22, 0xa1, 0x66, 0x61, 0x37, + 0x1a, 0xaa, 0xaa, 0xaa, 0xa3, 0xa1, 0x13, 0x3a, + 0x11, 0x11, 0x11, 0x10, 0x5b, 0xdd, 0xdd, 0xdc, + 0xdd, 0xdd, 0xbd, 0xd9, 0x00, 0x00, 0xec, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xee, 0x86, + 0x17, 0x22, 0x22, 0x22, 0x23, 0x16, 0x66, 0xaa, + 0xaa, 0xa3, 0x3a, 0xaa, 0xaa, 0x1a, 0x3a, 0xa1, + 0x11, 0x11, 0x1a, 0x70, 0x05, 0xbd, 0xdd, 0xdd, + 0xdb, 0x5b, 0xdd, 0xb0, 0x00, 0x60, 0x2e, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xe6, 0x88, + 0x66, 0x32, 0x22, 0x22, 0x22, 0x36, 0x66, 0x11, + 0x33, 0x33, 0x3a, 0xaa, 0x11, 0xaa, 0xaa, 0xa1, + 0x11, 0x1a, 0x3a, 0x60, 0x02, 0x99, 0xbb, 0xb9, + 0x9b, 0xbb, 0xbc, 0x22, 0x00, 0x86, 0x5e, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xe1, 0x68, + 0x86, 0x63, 0x22, 0x22, 0x22, 0x2a, 0x66, 0x66, + 0x33, 0x33, 0xaa, 0xaa, 0x1a, 0xaa, 0xaa, 0x11, + 0x1a, 0xa7, 0x68, 0x80, 0x02, 0x2b, 0xbd, 0xbb, + 0xbb, 0xb9, 0x22, 0x22, 0x00, 0x06, 0x6e, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc7, 0xa6, + 0x88, 0x86, 0x32, 0x22, 0x22, 0x27, 0xa6, 0x66, + 0x33, 0x3a, 0xaa, 0xa1, 0xaa, 0xaa, 0xa1, 0x11, + 0xa3, 0xa6, 0x88, 0x80, 0x02, 0x22, 0x9b, 0xbb, + 0xbb, 0x22, 0x24, 0xf4, 0x60, 0x00, 0x0c, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc2, 0x21, + 0x68, 0x88, 0x63, 0x22, 0x22, 0x22, 0x71, 0x66, + 0x33, 0x3a, 0x11, 0x11, 0xaa, 0xaa, 0x11, 0xaa, + 0x71, 0x88, 0x88, 0x00, 0x02, 0xe2, 0x26, 0x99, + 0x22, 0x22, 0x4f, 0xf4, 0x40, 0x00, 0x0c, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x22, 0x22, + 0x16, 0x88, 0x86, 0xa2, 0x22, 0x22, 0x27, 0x11, + 0x33, 0xa1, 0x11, 0x11, 0xaa, 0x31, 0x1a, 0xa3, + 0x68, 0x88, 0x81, 0x00, 0x54, 0x42, 0x22, 0x22, + 0x22, 0x44, 0xff, 0xff, 0x48, 0x00, 0x00, 0x99, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x22, 0x22, + 0x21, 0x88, 0x88, 0x6a, 0x22, 0x22, 0x22, 0x31, + 0x3a, 0xa1, 0x11, 0x1a, 0xa3, 0x11, 0x33, 0x36, + 0x88, 0x86, 0x30, 0x00, 0x4f, 0x44, 0x22, 0x22, + 0x24, 0xff, 0xff, 0xff, 0x44, 0x00, 0x00, 0x99, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x95, 0x22, 0x72, + 0x22, 0x18, 0x88, 0x86, 0x32, 0x22, 0x22, 0x27, + 0xaa, 0x11, 0x11, 0x1a, 0x31, 0x13, 0x33, 0x68, + 0x88, 0x6a, 0x00, 0x02, 0x4f, 0x4f, 0x42, 0x24, + 0x4f, 0xff, 0xff, 0xff, 0xf4, 0x50, 0x00, 0x99, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x22, 0x73, + 0x72, 0x26, 0x88, 0x88, 0x63, 0x22, 0x22, 0x22, + 0x11, 0x11, 0x11, 0xa3, 0xa1, 0x73, 0xa6, 0x88, + 0x81, 0xa5, 0x00, 0x04, 0x4f, 0x4f, 0x44, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x40, 0x00, 0x99, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x12, 0x27, + 0xaa, 0x22, 0x68, 0x55, 0x86, 0x72, 0x22, 0x22, + 0x11, 0x11, 0x1a, 0x33, 0x13, 0x3a, 0x18, 0x88, + 0x1a, 0x10, 0x00, 0x44, 0x4f, 0x4f, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x99, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x61, 0x22, + 0x3a, 0xa2, 0x26, 0x85, 0x58, 0x67, 0x22, 0x22, + 0x61, 0x61, 0x1a, 0x7a, 0x37, 0x31, 0x88, 0x81, + 0x11, 0x00, 0x05, 0xe4, 0x44, 0xff, 0xff, 0xff, + 0x4f, 0xf4, 0x44, 0xff, 0xff, 0xf5, 0x00, 0x99, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x88, 0x12, + 0x2a, 0xaa, 0x72, 0x68, 0x55, 0x81, 0x22, 0x22, + 0x66, 0x61, 0xa3, 0x33, 0x73, 0x16, 0x88, 0x11, + 0x10, 0x00, 0x08, 0x74, 0x44, 0x4f, 0x44, 0x44, + 0xf4, 0xf4, 0x44, 0x44, 0xe2, 0x44, 0x00, 0x99, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x88, 0x81, + 0x22, 0xaa, 0xa7, 0x26, 0x85, 0x88, 0x12, 0x22, + 0x66, 0x61, 0x37, 0xa7, 0x3a, 0x66, 0x66, 0x11, + 0x80, 0x00, 0x0a, 0x72, 0x44, 0x4f, 0x44, 0x4f, + 0xff, 0x44, 0x44, 0x22, 0x22, 0x24, 0x00, 0x99, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0x85, 0x88, + 0x12, 0x2a, 0xaa, 0x22, 0x68, 0x58, 0x63, 0x22, + 0x66, 0x1a, 0x73, 0x77, 0x31, 0x66, 0x61, 0x11, + 0x00, 0x00, 0x07, 0x44, 0xff, 0x4f, 0xf4, 0x4f, + 0xff, 0x4f, 0x44, 0xf4, 0x42, 0x22, 0x40, 0x9b, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb9, 0x85, 0x55, + 0x81, 0x27, 0xaa, 0xa2, 0x78, 0x88, 0x86, 0x72, + 0x66, 0x13, 0x77, 0x73, 0x11, 0x66, 0x61, 0x76, + 0x00, 0x50, 0x84, 0xf4, 0xff, 0x4f, 0xf4, 0xff, + 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x42, 0x40, 0x9b, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb9, 0x68, 0x55, + 0x58, 0x12, 0x3a, 0xaa, 0x23, 0x88, 0x88, 0xa7, + 0x66, 0xa7, 0x77, 0x7a, 0x16, 0x66, 0x1a, 0x15, + 0x05, 0x00, 0x4f, 0xf4, 0xff, 0x4f, 0xf4, 0xff, + 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x44, 0x24, 0x9b, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb9, 0x26, 0x55, + 0x55, 0x81, 0x23, 0xaa, 0x32, 0x18, 0x88, 0x6a, + 0x61, 0x37, 0x77, 0x31, 0x66, 0x66, 0x17, 0x60, + 0x05, 0x08, 0x4f, 0xf4, 0xff, 0x4f, 0xf4, 0xff, + 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x4f, 0x4e, 0x99, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x99, 0xa2, 0x65, + 0x55, 0x58, 0xa2, 0x7a, 0xa2, 0x26, 0x88, 0x61, + 0x61, 0x32, 0x27, 0xa1, 0x66, 0x61, 0x31, 0x60, + 0x00, 0x04, 0x4f, 0xf4, 0xff, 0x44, 0x44, 0xff, + 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x44, 0xf4, 0x99, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x9b, 0xaa, 0x26, + 0x55, 0x55, 0x87, 0x27, 0x33, 0x27, 0x68, 0x61, + 0x1a, 0x72, 0x27, 0xa6, 0x66, 0x6a, 0x71, 0x00, + 0x80, 0x84, 0xff, 0xf4, 0xff, 0x44, 0x44, 0xff, + 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x44, 0xf4, 0x99, + 0x9b, 0x9b, 0x99, 0xb9, 0xb9, 0x99, 0xaa, 0xa2, + 0x85, 0x55, 0x56, 0x22, 0x27, 0x22, 0x36, 0x66, + 0x13, 0x22, 0x23, 0x16, 0x86, 0x63, 0x73, 0x00, + 0x00, 0x44, 0xf4, 0xf4, 0xff, 0x44, 0x44, 0xff, + 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x4f, 0x4f, 0x99, + 0x9b, 0x99, 0x99, 0x99, 0xb9, 0x99, 0xaa, 0xaa, + 0x28, 0x55, 0x58, 0x12, 0x22, 0x22, 0x21, 0x11, + 0xa3, 0x27, 0x7a, 0x66, 0x86, 0x17, 0x75, 0x05, + 0x05, 0xff, 0xf4, 0xf4, 0xff, 0x44, 0x44, 0xff, + 0xff, 0x4f, 0x44, 0x4f, 0x4f, 0x44, 0x4f, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x3a, 0xaa, + 0xa2, 0x85, 0x58, 0x67, 0x72, 0x22, 0x27, 0xa1, + 0x37, 0x27, 0x7a, 0x68, 0x86, 0xa2, 0x70, 0x00, + 0x02, 0xff, 0xf4, 0xf4, 0xff, 0x44, 0x44, 0x4f, + 0xff, 0x4f, 0x44, 0xf4, 0xf4, 0xf4, 0xf4, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x23, 0xaa, + 0xa7, 0x78, 0x88, 0x81, 0x77, 0x22, 0x27, 0x3a, + 0x72, 0x73, 0x71, 0x68, 0x66, 0x32, 0x50, 0x00, + 0x04, 0x4f, 0xf4, 0xf4, 0xff, 0x44, 0x44, 0x4f, + 0xff, 0x4f, 0x44, 0xf4, 0xf4, 0xf4, 0x44, 0x95, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x55, 0x12, 0x3a, + 0xaa, 0x21, 0x88, 0x81, 0x77, 0x27, 0x73, 0x73, + 0x72, 0x33, 0x36, 0x86, 0x61, 0x72, 0x00, 0x00, + 0x04, 0x44, 0xf4, 0xf4, 0xf4, 0x44, 0x44, 0x4f, + 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x4f, 0x44, 0x55, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x8a, 0x27, + 0xaa, 0x77, 0x68, 0x61, 0x23, 0x71, 0x11, 0x3a, + 0x27, 0xa3, 0x36, 0x86, 0x61, 0x20, 0x00, 0x00, + 0x04, 0xf4, 0xf4, 0xf4, 0xf4, 0x44, 0x44, 0x4f, + 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x4f, 0x41, 0x59, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x95, 0x58, 0x77, + 0x27, 0x32, 0x36, 0x63, 0x23, 0x71, 0x66, 0x11, + 0x27, 0x13, 0xa6, 0x86, 0x6a, 0x20, 0x00, 0x50, + 0x04, 0x4f, 0x4f, 0x4f, 0x4f, 0x44, 0x44, 0x4f, + 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x4f, 0x41, 0x99, + 0x9b, 0xbb, 0xbb, 0xbb, 0xb9, 0x99, 0x68, 0x13, + 0x32, 0x22, 0x73, 0xa7, 0x2a, 0x31, 0x88, 0x66, + 0x7a, 0x13, 0x18, 0x66, 0x63, 0x20, 0x00, 0x06, + 0x0f, 0x4f, 0x4f, 0x4f, 0x4f, 0x44, 0x44, 0x4f, + 0xff, 0x4f, 0x44, 0xff, 0x4f, 0x4f, 0x49, 0x95, + 0xa9, 0xa9, 0x99, 0x97, 0x92, 0x99, 0x65, 0x6a, + 0x17, 0x22, 0x23, 0x72, 0x27, 0xaa, 0x88, 0x88, + 0xa1, 0x17, 0x68, 0x66, 0x67, 0x70, 0x00, 0x05, + 0x0f, 0x4f, 0x4f, 0x4f, 0x4f, 0x44, 0x44, 0x4f, + 0xff, 0x4f, 0x44, 0xff, 0xf4, 0xf4, 0x49, 0x9c, + 0x2e, 0xee, 0xee, 0xee, 0xee, 0xa9, 0x65, 0x8a, + 0x1a, 0xaa, 0x37, 0x72, 0x27, 0x37, 0x88, 0x88, + 0x11, 0x17, 0x68, 0x66, 0x67, 0x10, 0x9d, 0xd0, + 0x84, 0x44, 0xff, 0x4f, 0x4f, 0x44, 0xf4, 0x4f, + 0xff, 0x4f, 0x44, 0xff, 0xf4, 0xf4, 0x4f, 0x69, + 0xcc, 0xee, 0xee, 0xee, 0xec, 0x99, 0x88, 0x63, + 0x61, 0x68, 0x61, 0x72, 0x22, 0x7a, 0x68, 0x88, + 0x11, 0x17, 0x88, 0x66, 0x12, 0x1b, 0xdd, 0xdd, + 0x02, 0x44, 0x4f, 0x4f, 0x4f, 0x44, 0x44, 0x4f, + 0xff, 0x4f, 0x44, 0xff, 0xff, 0x4f, 0x4c, 0xc5, + 0x0c, 0xc1, 0x11, 0x1c, 0xc0, 0x26, 0x66, 0x17, + 0x66, 0x88, 0x88, 0x12, 0x22, 0x23, 0xa8, 0x88, + 0x11, 0x13, 0x88, 0x66, 0x17, 0xbb, 0xdd, 0xdd, + 0xd0, 0x8f, 0xff, 0xf4, 0xf4, 0x44, 0xf4, 0x4f, + 0xff, 0x4f, 0x44, 0xf4, 0x4f, 0x44, 0xdd, 0xdd, + 0x00, 0x00, 0x00, 0x05, 0x9d, 0x21, 0x66, 0x27, + 0xa6, 0x65, 0x58, 0x67, 0x22, 0x27, 0x28, 0x88, + 0x11, 0xaa, 0x86, 0x68, 0x1a, 0xbb, 0xdd, 0xdd, + 0xdb, 0x05, 0xf4, 0xf4, 0xf4, 0xf4, 0x44, 0x4f, + 0xff, 0x4f, 0x44, 0xf4, 0xf4, 0xf4, 0xdd, 0xdb, + 0x00, 0x00, 0x00, 0x00, 0xdd, 0xda, 0x66, 0x22, + 0x71, 0x15, 0x55, 0x81, 0x22, 0x22, 0x76, 0x88, + 0x11, 0x31, 0x88, 0x88, 0xab, 0xbd, 0xdd, 0xdd, + 0xdd, 0x00, 0x04, 0x44, 0xff, 0xff, 0x4f, 0x4f, + 0xff, 0x4f, 0x44, 0xf4, 0xf4, 0x44, 0xdd, 0xdb, + 0x00, 0x00, 0x00, 0x0b, 0xdd, 0xda, 0x11, 0x22, + 0x23, 0x68, 0x55, 0x86, 0x22, 0x22, 0x7a, 0x88, + 0x1a, 0x71, 0x88, 0x89, 0xbb, 0xdd, 0xdd, 0xdd, + 0xdd, 0xd0, 0x00, 0x4f, 0x44, 0xff, 0x4f, 0x4f, + 0xff, 0x4f, 0x44, 0xf4, 0xff, 0xe2, 0xdd, 0xdb, + 0x90, 0x00, 0x05, 0xbd, 0xdd, 0xb8, 0x63, 0x22, + 0x27, 0xa6, 0x55, 0x88, 0x77, 0x22, 0x22, 0x88, + 0x1a, 0x28, 0xbd, 0xdb, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdb, 0x00, 0x07, 0x44, 0x4f, 0x4f, 0x4f, + 0xff, 0x4f, 0x44, 0x4f, 0x4f, 0x22, 0xdd, 0xdb, + 0xbb, 0x9b, 0xbb, 0xbd, 0xdd, 0xd5, 0x86, 0x22, + 0x22, 0x77, 0x85, 0x88, 0x17, 0x22, 0x22, 0x88, + 0xaa, 0x2b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0x00, 0x00, 0x54, 0x4f, 0x4f, 0x4f, + 0xff, 0x4f, 0x44, 0xf4, 0x44, 0x22, 0xbd, 0xdd, + 0xbb, 0xbb, 0xbb, 0xdd, 0xdd, 0xdd, 0x88, 0x72, + 0x27, 0x22, 0x88, 0x88, 0x67, 0x72, 0x22, 0x18, + 0x33, 0x2d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xd0, 0x00, 0x05, 0x4f, 0x4f, 0x4f, + 0xff, 0x4f, 0x44, 0x44, 0x4f, 0x22, 0xbd, 0xdd, + 0xdb, 0xbb, 0xdd, 0xdd, 0xdd, 0xdd, 0x88, 0x17, + 0x27, 0x72, 0x68, 0x88, 0x87, 0x32, 0x22, 0x36, + 0x37, 0x2d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xd5, 0x00, 0x00, 0x4f, 0x4f, 0x4f, + 0xff, 0xf4, 0xf4, 0xf4, 0xf4, 0x22, 0xbb, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd8, 0x67, + 0x72, 0x77, 0x38, 0x88, 0x83, 0x37, 0x22, 0x26, + 0x72, 0x2b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0x00, 0x00, 0x4f, 0x4f, 0x4f, + 0xff, 0xf4, 0xf4, 0xf4, 0x44, 0x25, 0xbb, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd3, + 0x32, 0x73, 0x76, 0x88, 0x81, 0x33, 0x22, 0x2a, + 0x22, 0x2b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xb0, 0x54, 0x4f, 0x4f, 0x4f, + 0xff, 0xf4, 0xf4, 0xff, 0x44, 0x00, 0xbb, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xa7, 0x73, 0x26, 0x88, 0x86, 0x7a, 0x72, 0x27, + 0x22, 0x2b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdb, 0x44, 0xff, 0x4f, 0x4f, + 0xff, 0xf4, 0xf4, 0x44, 0x40, 0x05, 0xbb, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0x13, 0x23, 0x21, 0x68, 0x86, 0x17, 0x72, 0x22, + 0x22, 0x2b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdb, 0x44, 0x4f, 0x4f, 0x4f, + 0xff, 0xff, 0x44, 0x42, 0x00, 0x05, 0xbd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0x87, 0x27, 0x27, 0x16, 0x66, 0x67, 0x22, 0x22, + 0x72, 0x7b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0x94, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x00, 0x00, 0x05, 0xbb, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xb8, + 0x86, 0x22, 0x22, 0x7a, 0x68, 0x81, 0x22, 0x22, + 0x37, 0x7b, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdb, 0xb5, 0x44, 0x44, 0x44, + 0x44, 0x47, 0x00, 0x00, 0x00, 0x05, 0xbd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd8, 0x68, + 0x58, 0x72, 0x22, 0x27, 0x18, 0x86, 0x72, 0x22, + 0x1a, 0xbb, 0xbd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdb, 0xb5, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xbb, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xb9, 0x18, 0x85, + 0x58, 0x12, 0x22, 0x36, 0x18, 0x88, 0x32, 0x22, + 0x61, 0x3b, 0xbb, 0xbb, 0xbd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdb, 0xb9, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xbb, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xb9, 0x7a, 0x68, 0x85, + 0x88, 0x62, 0x27, 0x16, 0x18, 0x88, 0x12, 0x27, + 0x86, 0x18, 0x9b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, + 0xdd, 0xdd, 0xdd, 0xbb, 0xb5, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xbb, 0xbd, + 0xdd, 0xdd, 0xdb, 0xbb, 0x87, 0x31, 0x68, 0x65, + 0x88, 0x82, 0x23, 0x16, 0x18, 0x88, 0x12, 0x23, + 0x88, 0x67, 0x27, 0xa8, 0x9b, 0xbb, 0xbb, 0xbb, + 0xbd, 0xdd, 0xbb, 0xbb, 0x95, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x9b, 0xbb, + 0xbb, 0xbb, 0xbb, 0x96, 0x87, 0x16, 0x68, 0x18, + 0x88, 0x62, 0x31, 0x66, 0x18, 0x88, 0x62, 0x73, + 0x88, 0x63, 0x27, 0x33, 0x65, 0x55, 0x99, 0x9b, + 0xbb, 0xbb, 0xbb, 0x99, 0x55, 0x0a, 0xa1, 0x86, + 0x81, 0x68, 0x88, 0x55, 0x58, 0x85, 0x9b, 0xbb, + 0xbb, 0xbb, 0x95, 0x88, 0x83, 0x66, 0x66, 0x18, + 0x66, 0x82, 0xa1, 0x66, 0x18, 0x88, 0x62, 0x33, + 0x88, 0x81, 0x27, 0x7a, 0x18, 0x58, 0x86, 0x85, + 0x99, 0x99, 0x99, 0x95, 0x53, 0x2a, 0xaa, 0x88, + 0x67, 0x31, 0x68, 0x55, 0x58, 0x85, 0x59, 0xbb, + 0xbb, 0xb9, 0x58, 0x68, 0x83, 0x66, 0x61, 0x16, + 0x66, 0x62, 0x16, 0x66, 0x68, 0x88, 0x62, 0xaa, + 0x88, 0x86, 0x27, 0x77, 0x78, 0x55, 0x88, 0x22, + 0x25, 0x55, 0x95, 0x55, 0x6a, 0xa2, 0x2a, 0x88, + 0x62, 0x27, 0x37, 0x38, 0x88, 0x87, 0x55, 0x59, + 0x95, 0x58, 0x16, 0x88, 0x8a, 0x66, 0x63, 0x68, + 0x86, 0x67, 0x66, 0x66, 0x68, 0x88, 0x12, 0x11, + 0x88, 0x88, 0x72, 0x77, 0x78, 0x85, 0x58, 0x17, + 0x23, 0x32, 0x55, 0x55, 0x81, 0x13, 0x73, 0x66, + 0x62, 0x7a, 0xaa, 0x38, 0x88, 0x58, 0x27, 0x55, + 0x58, 0x32, 0x38, 0x88, 0x81, 0x66, 0xa2, 0x88, + 0x86, 0x61, 0x66, 0x61, 0x66, 0x68, 0x13, 0x11, + 0x88, 0x88, 0x12, 0x22, 0x71, 0x85, 0x58, 0x62, + 0x23, 0xa2, 0x68, 0x88, 0x81, 0x66, 0x88, 0x88, + 0x63, 0x2a, 0xaa, 0x28, 0x88, 0x55, 0x86, 0x61, + 0x66, 0x66, 0x68, 0x88, 0x66, 0x66, 0x77, 0x88, + 0x68, 0x16, 0x66, 0x62, 0x66, 0x68, 0xa1, 0x61, + 0x88, 0x88, 0x62, 0x22, 0x22, 0x85, 0x55, 0x83, + 0x72, 0x37, 0xa8, 0x88, 0x61, 0x66, 0x85, 0x55, + 0x86, 0x23, 0xaa, 0x71, 0x88, 0x85, 0x88, 0x66, + 0x88, 0x86, 0x88, 0x88, 0x16, 0x61, 0x21, 0x88, + 0x66, 0xa6, 0x86, 0x17, 0x66, 0x66, 0x31, 0x61, + 0x88, 0x88, 0x87, 0x72, 0x22, 0x68, 0x55, 0x86, + 0x77, 0x77, 0x36, 0x88, 0x13, 0x68, 0x85, 0x55, + 0x58, 0x12, 0x73, 0x72, 0x76, 0x88, 0x88, 0x68, + 0x88, 0x88, 0x88, 0x66, 0x36, 0x63, 0x26, 0x86, + 0x86, 0x36, 0x86, 0x11, 0x66, 0x66, 0x76, 0x61, + 0x88, 0x88, 0x81, 0x22, 0x22, 0x38, 0x85, 0x58, + 0x37, 0x22, 0x21, 0x68, 0xa2, 0x31, 0x68, 0x55, + 0x55, 0x81, 0x22, 0x22, 0xa8, 0x88, 0x88, 0x68, + 0x86, 0x88, 0x68, 0x81, 0x36, 0x17, 0x21, 0x68, + 0x86, 0x16, 0x66, 0x26, 0x66, 0x61, 0x36, 0x66, + 0x68, 0x88, 0x86, 0x27, 0x22, 0x28, 0x88, 0x88, + 0x17, 0x72, 0x2a, 0x66, 0xa2, 0x22, 0x36, 0x55, + 0x55, 0x58, 0x37, 0x3a, 0x16, 0x66, 0x66, 0x66, + 0x66, 0x18, 0x88, 0x67, 0x16, 0x12, 0x71, 0x68, + 0x81, 0x68, 0x61, 0x76, 0x66, 0x6a, 0x16, 0x66, + 0x88, 0x88, 0x86, 0x77, 0x22, 0x26, 0x88, 0x88, + 0x13, 0x37, 0x71, 0x66, 0xa2, 0x33, 0x2a, 0x85, + 0x55, 0x55, 0x17, 0x73, 0x16, 0x66, 0x66, 0x68, + 0x63, 0x88, 0x88, 0xa2, 0x66, 0xa2, 0xa6, 0x88, + 0x61, 0x68, 0x6a, 0x76, 0x66, 0x6a, 0x66, 0x6a +}; + +#endif diff --git a/include/linux/loop.h b/include/linux/loop.h index be2c1753b..75f6cc704 100644 --- a/include/linux/loop.h +++ b/include/linux/loop.h @@ -17,7 +17,7 @@ struct loop_device { int lo_number; - struct inode *lo_inode; + struct dentry *lo_dentry; int lo_refcnt; kdev_t lo_device; int lo_offset; @@ -36,6 +36,7 @@ struct loop_device { idea_key lo_idea_en_key; idea_key lo_idea_de_key; #endif + struct file * lo_backing_file; }; typedef int (* transfer_proc_t)(struct loop_device *, int cmd, diff --git a/include/linux/lp.h b/include/linux/lp.h index b50c6b434..937df9386 100644 --- a/include/linux/lp.h +++ b/include/linux/lp.h @@ -129,6 +129,8 @@ struct lp_struct { #endif struct wait_queue *wait_q; unsigned int last_error; + volatile unsigned int irq_detected:1; + volatile unsigned int irq_missed:1; }; /* diff --git a/include/linux/lp_m68k.h b/include/linux/lp_m68k.h index ca8f7a31d..f87bf4eff 100644 --- a/include/linux/lp_m68k.h +++ b/include/linux/lp_m68k.h @@ -92,7 +92,9 @@ LP_UNKNOWN = 0, LP_AMIGA = 1, LP_ATARI = 2, LP_MFC = 3, -LP_IOEXT = 4 +LP_IOEXT = 4, +LP_MVME167 = 5, +LP_BVME6000 = 6 }; /* diff --git a/include/linux/major.h b/include/linux/major.h index 8a59c1fb6..83c3a7f21 100644 --- a/include/linux/major.h +++ b/include/linux/major.h @@ -8,8 +8,12 @@ /* limits */ -#define MAX_CHRDEV 128 -#define MAX_BLKDEV 128 +/* + * Important: Don't change this to 256. Major number 255 is and must be + * reserved for future expansion into a larger dev_t space. + */ +#define MAX_CHRDEV 255 +#define MAX_BLKDEV 255 #define UNNAMED_MAJOR 0 #define MEM_MAJOR 1 @@ -40,6 +44,7 @@ #define CYCLADES_MAJOR 19 #define CYCLADESAUX_MAJOR 20 #define MITSUMI_X_CDROM_MAJOR 20 +#define MFM_ACORN_MAJOR 21 /* ARM Linux /dev/mfm */ #define SCSI_GENERIC_MAJOR 21 #define Z8530_MAJOR 34 #define DIGI_MAJOR 23 @@ -81,6 +86,10 @@ #define SPECIALIX_NORMAL_MAJOR 75 #define SPECIALIX_CALLOUT_MAJOR 76 +#define UNIX98_PTY_MASTER_MAJOR 128 +#define UNIX98_PTY_MAJOR_COUNT 8 +#define UNIX98_PTY_SLAVE_MAJOR (UNIX98_PTY_MASTER_MAJOR+UNIX98_PTY_MAJOR_COUNT) + /* * Tests for SCSI devices. */ diff --git a/include/linux/md.h b/include/linux/md.h index cb0d899e2..f4f4f5486 100644 --- a/include/linux/md.h +++ b/include/linux/md.h @@ -33,9 +33,10 @@ #define MD_DEFAULT_DISK_READAHEAD (256 * 1024) /* ioctls */ -#define REGISTER_DEV _IO (MD_MAJOR, 1) -#define START_MD _IO (MD_MAJOR, 2) -#define STOP_MD _IO (MD_MAJOR, 3) +#define REGISTER_DEV _IO (MD_MAJOR, 1) +#define START_MD _IO (MD_MAJOR, 2) +#define STOP_MD _IO (MD_MAJOR, 3) +#define REGISTER_DEV_NEW _IO (MD_MAJOR, 4) /* personalities : @@ -199,6 +200,7 @@ typedef struct md_superblock_s { #include <linux/mm.h> #include <linux/fs.h> #include <linux/blkdev.h> +#include <asm/semaphore.h> /* * Kernel-based reconstruction is mostly working, but still requires @@ -209,12 +211,6 @@ typedef struct md_superblock_s { #define MAX_REAL 8 /* Max number of physical dev per md dev */ #define MAX_MD_DEV 4 /* Max number of md dev */ -#if SUPPORT_RECONSTRUCTION -#define MAX_MD_THREADS (MAX_MD_DEV * 3) /* Max number of kernel threads */ -#else -#define MAX_MD_THREADS (MAX_MD_DEV) /* Max number of kernel threads */ -#endif /* SUPPORT_RECONSTRUCTION */ - #define FACTOR(a) ((a)->repartition & FACTOR_MASK) #define MAX_FAULT(a) (((a)->repartition & FAULT_MASK)>>8) #define PERSONALITY(a) ((a)->repartition & PERSONALITY_MASK) @@ -279,10 +275,12 @@ struct md_thread { void (*run) (void *data); void *data; struct wait_queue *wqueue; - __u32 flags; + unsigned long flags; + struct semaphore *sem; + struct task_struct *tsk; }; -#define THREAD_WAKEUP 0 +#define THREAD_WAKEUP 0 extern struct md_dev md_dev[MAX_MD_DEV]; extern int md_size[MAX_MD_DEV]; diff --git a/include/linux/minix_fs.h b/include/linux/minix_fs.h index 20a8cd66d..6b9b6d649 100644 --- a/include/linux/minix_fs.h +++ b/include/linux/minix_fs.h @@ -15,6 +15,7 @@ /* Not the same as the bogus LINK_MAX in <linux/limits.h>. Oh well. */ #define MINIX_LINK_MAX 250 +#define MINIX2_LINK_MAX 65530 #define MINIX_I_MAP_SLOTS 8 #define MINIX_Z_MAP_SLOTS 64 @@ -126,6 +127,7 @@ extern int minix_sync_file(struct file *, struct dentry *); extern struct inode_operations minix_file_inode_operations; extern struct inode_operations minix_dir_inode_operations; extern struct inode_operations minix_symlink_inode_operations; +extern struct dentry_operations minix_dentry_operations; #endif /* __KERNEL__ */ diff --git a/include/linux/minix_fs_sb.h b/include/linux/minix_fs_sb.h index c533e63ac..54c82af99 100644 --- a/include/linux/minix_fs_sb.h +++ b/include/linux/minix_fs_sb.h @@ -12,8 +12,9 @@ struct minix_sb_info { unsigned long s_firstdatazone; unsigned long s_log_zone_size; unsigned long s_max_size; - unsigned long s_dirsize; - unsigned long s_namelen; + int s_dirsize; + int s_namelen; + int s_link_max; struct buffer_head ** s_imap; struct buffer_head ** s_zmap; struct buffer_head * s_sbh; diff --git a/include/linux/mm.h b/include/linux/mm.h index 8114875ae..60c0ab8f9 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -137,6 +137,7 @@ typedef struct page { #define PG_DMA 7 #define PG_Slab 8 #define PG_swap_cache 9 +#define PG_skip 10 #define PG_reserved 31 /* Make it prettier to test the above... */ @@ -254,21 +255,10 @@ extern inline unsigned long get_free_page(int gfp_mask) /* memory.c & swap.c*/ /* - * This traverses "nr" memory size lists, - * and returns true if there is enough memory. - * - * For example, we want to keep on waking up - * kswapd every once in a while until the highest - * memory order has an entry (ie nr == 0), but - * we want to do it in the background. - * - * We want to do it in the foreground only if - * none of the three highest lists have enough - * memory. Random number. + * Decide if we should try to do some swapout.. */ -extern int free_memory_available(int nr); -#define kswapd_continue() (!free_memory_available(3)) -#define kswapd_wakeup() (!free_memory_available(0)) +extern int free_memory_available(void); +extern struct wait_queue * kswapd_wait; #define free_page(addr) free_pages((addr),0) extern void FASTCALL(free_pages(unsigned long addr, unsigned long order)); @@ -281,7 +271,6 @@ extern unsigned long put_dirty_page(struct task_struct * tsk,unsigned long page, extern void free_page_tables(struct mm_struct * mm); extern void clear_page_tables(struct task_struct * tsk); extern int new_page_tables(struct task_struct * tsk); -extern int copy_page_tables(struct task_struct * to); extern void zap_page_range(struct mm_struct *mm, unsigned long address, unsigned long size); extern int copy_page_range(struct mm_struct *dst, struct mm_struct *src, struct vm_area_struct *vma); @@ -290,6 +279,10 @@ extern int zeromap_page_range(unsigned long from, unsigned long size, pgprot_t p extern int vmap_page_range (unsigned long from, unsigned long size, unsigned long vaddr); extern void vmtruncate(struct inode * inode, unsigned long offset); extern void handle_mm_fault(struct task_struct *tsk,struct vm_area_struct *vma, unsigned long address, int write_access); +extern void make_pages_present(unsigned long addr, unsigned long end); + +extern int pgt_cache_water[2]; +extern int check_pgt_cache(void); extern unsigned long paging_init(unsigned long start_mem, unsigned long end_mem); extern void mem_init(unsigned long start_mem, unsigned long end_mem); @@ -299,16 +292,18 @@ extern void si_meminfo(struct sysinfo * val); /* mmap.c */ extern void vma_init(void); -extern unsigned long do_mmap(struct file * file, unsigned long addr, unsigned long len, - unsigned long prot, unsigned long flags, unsigned long off); extern void merge_segments(struct mm_struct *, unsigned long, unsigned long); extern void insert_vm_struct(struct mm_struct *, struct vm_area_struct *); extern void exit_mmap(struct mm_struct *); -extern int do_munmap(unsigned long, size_t); extern unsigned long get_unmapped_area(unsigned long, unsigned long); +extern unsigned long do_mmap(struct file *, unsigned long, unsigned long, + unsigned long, unsigned long, unsigned long); +extern int do_munmap(unsigned long, size_t); + /* filemap.c */ -extern unsigned long page_unuse(unsigned long); +extern void remove_inode_page(struct page *); +extern unsigned long page_unuse(struct page *); extern int shrink_mmap(int, int); extern void truncate_inode_pages(struct inode *, unsigned long); extern unsigned long get_cached_page(struct inode *, unsigned long, int); @@ -318,8 +313,7 @@ extern void put_cached_page(unsigned long); * GFP bitmasks.. */ #define __GFP_WAIT 0x01 -#define __GFP_IO 0x02 -#define __GFP_LOW 0x00 +#define __GFP_LOW 0x02 #define __GFP_MED 0x04 #define __GFP_HIGH 0x08 @@ -328,9 +322,9 @@ extern void put_cached_page(unsigned long); #define GFP_BUFFER (__GFP_LOW | __GFP_WAIT) #define GFP_ATOMIC (__GFP_HIGH) -#define GFP_USER (__GFP_LOW | __GFP_WAIT | __GFP_IO) -#define GFP_KERNEL (__GFP_LOW | __GFP_WAIT | __GFP_IO) -#define GFP_NFS (__GFP_MED | __GFP_WAIT | __GFP_IO) +#define GFP_USER (__GFP_LOW | __GFP_WAIT) +#define GFP_KERNEL (__GFP_MED | __GFP_WAIT) +#define GFP_NFS (__GFP_HIGH | __GFP_WAIT) /* Flag - indicates that the buffer should be allocated uncached as for an architecture where the caches don't snoop DMA access. This is a even diff --git a/include/linux/mount.h b/include/linux/mount.h index c2e44397a..7e7ccb266 100644 --- a/include/linux/mount.h +++ b/include/linux/mount.h @@ -3,28 +3,44 @@ * Definitions for mount interface. This describes the in the kernel build * linkedlist with mounted filesystems. * - * Author: Marco van Wieringen <mvw@mcs.ow.nl> <mvw@tnix.net> <mvw@cistron.nl> + * Author: Marco van Wieringen <mvw@planets.elm.net> * - * Version: $Id: mount.h,v 1.3 1994/07/20 22:01:00 mvw Exp mvw $ + * Version: $Id: mount.h,v 2.0 1996/11/17 16:48:14 mvw Exp mvw $ * */ #ifndef _LINUX_MOUNT_H #define _LINUX_MOUNT_H +#define DQUOT_USR_ENABLED 0x01 /* User diskquotas enabled */ +#define DQUOT_GRP_ENABLED 0x02 /* Group diskquotas enabled */ + +struct quota_mount_options +{ + unsigned int flags; /* Flags for diskquotas on this device */ + struct semaphore semaphore; /* lock device while I/O in progress */ + struct file *files[MAXQUOTAS]; /* fp's to quotafiles */ + time_t inode_expire[MAXQUOTAS]; /* expiretime for inode-quota */ + time_t block_expire[MAXQUOTAS]; /* expiretime for block-quota */ + char rsquash[MAXQUOTAS]; /* for quotas threath root as any other user */ +}; + struct vfsmount { - kdev_t mnt_dev; /* Device this applies to */ - char *mnt_devname; /* Name of device e.g. /dev/dsk/hda1 */ - char *mnt_dirname; /* Name of directory mounted on */ - unsigned int mnt_flags; /* Flags of this device */ - struct semaphore mnt_sem; /* lock device while I/O in progress */ - struct super_block *mnt_sb; /* pointer to superblock */ - struct file *mnt_quotas[MAXQUOTAS]; /* fp's to quotafiles */ - time_t mnt_iexp[MAXQUOTAS]; /* expiretime for inodes */ - time_t mnt_bexp[MAXQUOTAS]; /* expiretime for blocks */ - struct vfsmount *mnt_next; /* pointer to next in linkedlist */ + kdev_t mnt_dev; /* Device this applies to */ + char *mnt_devname; /* Name of device e.g. /dev/dsk/hda1 */ + char *mnt_dirname; /* Name of directory mounted on */ + unsigned int mnt_flags; /* Flags of this device */ + struct super_block *mnt_sb; /* pointer to superblock */ + struct quota_mount_options mnt_dquot; /* Diskquota specific mount options */ + struct vfsmount *mnt_next; /* pointer to next in linkedlist */ }; struct vfsmount *lookup_vfsmnt(kdev_t dev); +/* + * Umount options + */ + +#define MNT_FORCE 0x00000001 /* Attempt to forcibily umount */ + #endif /* _LINUX_MOUNT_H */ diff --git a/include/linux/msdos_fs_i.h b/include/linux/msdos_fs_i.h index 674999c58..1e677d5c7 100644 --- a/include/linux/msdos_fs_i.h +++ b/include/linux/msdos_fs_i.h @@ -21,7 +21,7 @@ struct msdos_inode_info { I have not put it conditional. With the advent of loadable file system drivers, it would be very easy to compile - a MsDOS FS driver unaware of UMSDOS and then later to + a MS-DOS FS driver unaware of UMSDOS and then later to load a (then incompatible) UMSDOS FS driver. */ struct pipe_inode_info reserved; diff --git a/include/linux/nbd.h b/include/linux/nbd.h index d2d613c50..c2f2a4e08 100644 --- a/include/linux/nbd.h +++ b/include/linux/nbd.h @@ -1,16 +1,13 @@ #ifndef LINUX_NBD_H #define LINUX_NBD_H -#include <linux/ioctl.h> -#include <asm/types.h> - -#define NBD_SET_SOCK _IO( 0xab, 0 ) -#define NBD_SET_BLKSIZE _IO( 0xab, 1 ) -#define NBD_SET_SIZE _IO( 0xab, 2 ) -#define NBD_DO_IT _IO( 0xab, 3 ) -#define NBD_CLEAR_SOCK _IO( 0xab, 4 ) -#define NBD_CLEAR_QUE _IO( 0xab, 5 ) -#define NBD_PRINT_DEBUG _IO( 0xab, 6 ) +#define NBD_SET_SOCK _IO( 0xab, 0 ) +#define NBD_SET_BLKSIZE _IO( 0xab, 1 ) +#define NBD_SET_SIZE _IO( 0xab, 2 ) +#define NBD_DO_IT _IO( 0xab, 3 ) +#define NBD_CLEAR_SOCK _IO( 0xab, 4 ) +#define NBD_CLEAR_QUE _IO( 0xab, 5 ) +#define NBD_PRINT_DEBUG _IO( 0xab, 6 ) #ifdef MAJOR_NR @@ -54,21 +51,23 @@ struct nbd_device { /* This now IS in some kind of include file... */ -#define NBD_REQUEST_MAGIC 0x12560953 -#define NBD_REPLY_MAGIC 0x96744668 -#define LO_MAGIC 0x68797548 +/* These are send over network in request/reply magic field */ + +#define NBD_REQUEST_MAGIC 0x25609513 +#define NBD_REPLY_MAGIC 0x67446698 +/* Do *not* use magics: 0x12560953 0x96744668. */ struct nbd_request { - __u32 magic; - __u32 from; - __u32 len; + u32 magic; + u32 type; /* == READ || == WRITE */ char handle[8]; - __u32 type; /* == READ || == WRITE */ + u64 from; + u32 len; }; struct nbd_reply { - __u32 magic; + u32 magic; + u32 error; /* 0 = ok, else error */ char handle[8]; /* handle you got from request */ - __u32 error; /* 0 = ok, else error */ }; #endif diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index aa9568e83..c42e43d9d 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -189,10 +189,15 @@ struct device unsigned int irq; /* device IRQ number */ /* Low-level status flags. */ - volatile unsigned char start, /* start an operation */ - interrupt; /* interrupt arrived */ - unsigned long tbusy; /* transmitter busy must be - long for bitops */ + volatile unsigned char start; /* start an operation */ + /* + * These two are just single-bit flags, but due to atomicity + * reasons they have to be inside a "unsigned long". However, + * they should be inside the SAME unsigned long instead of + * this wasteful use of memory.. + */ + unsigned long interrupt; /* bitops.. */ + unsigned long tbusy; /* transmitter busy */ struct device *next; @@ -251,8 +256,9 @@ struct device /* Protocol specific pointers */ - void *atalk_ptr; /* Appletalk link */ + void *atalk_ptr; /* AppleTalk link */ void *ip_ptr; /* IPv4 specific data */ + void *dn_ptr; /* DECnet specific data */ struct Qdisc *qdisc; struct Qdisc *qdisc_sleeping; diff --git a/include/linux/nfsd/export.h b/include/linux/nfsd/export.h index 355e96251..69144d1d8 100644 --- a/include/linux/nfsd/export.h +++ b/include/linux/nfsd/export.h @@ -60,7 +60,7 @@ struct svc_export { struct svc_client * ex_client; int ex_flags; struct dentry * ex_dentry; - dev_t ex_dev; + kdev_t ex_dev; ino_t ex_ino; uid_t ex_anon_uid; gid_t ex_anon_gid; @@ -84,8 +84,8 @@ int exp_writelock(void); void exp_unlock(void); struct svc_client * exp_getclient(struct sockaddr_in *sin); void exp_putclient(struct svc_client *clp); -struct svc_export * exp_get(struct svc_client *clp, dev_t dev, ino_t ino); -int exp_rootfh(struct svc_client *, dev_t, ino_t, +struct svc_export * exp_get(struct svc_client *clp, kdev_t dev, ino_t ino); +int exp_rootfh(struct svc_client *, kdev_t, ino_t, struct knfs_fh *); int nfserrno(int errno); void exp_nlmdetach(void); diff --git a/include/linux/nfsd/nfsd.h b/include/linux/nfsd/nfsd.h index d7f0851fe..aea15a68b 100644 --- a/include/linux/nfsd/nfsd.h +++ b/include/linux/nfsd/nfsd.h @@ -60,6 +60,7 @@ struct readdir_cd { }; typedef int (*encode_dent_fn)(struct readdir_cd *, const char *, int, off_t, ino_t); +typedef int (*nfsd_dirop_t)(struct inode *, struct dentry *, int, int); /* * Procedure table for NFSv2 @@ -72,6 +73,8 @@ extern struct svc_program nfsd_program; */ int nfsd_svc(unsigned short port, int nrservs); +/* nfsd/vfs.c */ +int fh_lock_parent(struct svc_fh *, struct dentry *); void nfsd_racache_init(void); int nfsd_lookup(struct svc_rqst *, struct svc_fh *, const char *, int, struct svc_fh *); diff --git a/include/linux/nfsd/nfsfh.h b/include/linux/nfsd/nfsfh.h index 3e3410776..d11d8e0c3 100644 --- a/include/linux/nfsd/nfsfh.h +++ b/include/linux/nfsd/nfsfh.h @@ -27,12 +27,12 @@ * ino/dev of the exported inode. */ struct nfs_fhbase { - struct dentry * fb_dentry; /* dentry cookie */ - ino_t fb_ino; /* our inode number */ - ino_t fb_dirino; /* dir inode number */ - dev_t fb_dev; /* our device */ - dev_t fb_xdev; - ino_t fb_xino; + struct dentry * fb_dentry; /* dentry cookie */ + __u32 fb_ino; /* our inode number */ + __u32 fb_dirino; /* dir inode number */ + __u32 fb_dev; /* our device */ + __u32 fb_xdev; + __u32 fb_xino; }; #define NFS_FH_PADDING (NFS_FHSIZE - sizeof(struct nfs_fhbase)) @@ -51,6 +51,29 @@ struct knfs_fh { #ifdef __KERNEL__ /* + * Conversion macros for the filehandle fields. + */ +extern inline __u32 kdev_t_to_u32(kdev_t dev) +{ + return (__u32) dev; +} + +extern inline kdev_t u32_to_kdev_t(__u32 udev) +{ + return (kdev_t) udev; +} + +extern inline __u32 ino_t_to_u32(ino_t ino) +{ + return (__u32) ino; +} + +extern inline ino_t u32_to_ino_t(__u32 uino) +{ + return (ino_t) uino; +} + +/* * This is the internal representation of an NFS handle used in knfsd. * pre_mtime/post_version will be used to support wcc_attr's in NFSv3. */ @@ -80,7 +103,7 @@ u32 fh_verify(struct svc_rqst *, struct svc_fh *, int, int); void fh_compose(struct svc_fh *, struct svc_export *, struct dentry *); void fh_update(struct svc_fh *); void fh_put(struct svc_fh *); -void nfsd_fh_flush(dev_t); +void nfsd_fh_flush(kdev_t); void nfsd_fh_init(void); void nfsd_fh_free(void); diff --git a/include/linux/nfsd/syscall.h b/include/linux/nfsd/syscall.h index 0bf4a5a58..896ead46b 100644 --- a/include/linux/nfsd/syscall.h +++ b/include/linux/nfsd/syscall.h @@ -12,6 +12,7 @@ #include <linux/config.h> #include <linux/types.h> #include <linux/socket.h> +#include <linux/posix_types.h> #include <linux/nfsd/const.h> #include <linux/nfsd/export.h> #include <linux/nfsd/nfsfh.h> @@ -54,29 +55,29 @@ struct nfsctl_client { struct nfsctl_export { char ex_client[NFSCLNT_IDMAX+1]; char ex_path[NFS_MAXPATHLEN+1]; - dev_t ex_dev; - ino_t ex_ino; + __kernel_dev_t ex_dev; + __kernel_ino_t ex_ino; int ex_flags; - uid_t ex_anon_uid; - gid_t ex_anon_gid; + __kernel_uid_t ex_anon_uid; + __kernel_gid_t ex_anon_gid; }; /* UGIDUPDATE */ struct nfsctl_uidmap { char * ug_ident; - uid_t ug_uidbase; + __kernel_uid_t ug_uidbase; int ug_uidlen; - uid_t * ug_udimap; - uid_t ug_gidbase; + __kernel_uid_t * ug_udimap; + __kernel_gid_t ug_gidbase; int ug_gidlen; - gid_t * ug_gdimap; + __kernel_gid_t * ug_gdimap; }; /* GETFH */ struct nfsctl_fhparm { struct sockaddr gf_addr; - dev_t gf_dev; - ino_t gf_ino; + __kernel_dev_t gf_dev; + __kernel_ino_t gf_ino; int gf_version; }; diff --git a/include/linux/openpic.h b/include/linux/openpic.h index 863e65997..1b6102a2f 100644 --- a/include/linux/openpic.h +++ b/include/linux/openpic.h @@ -3,10 +3,6 @@ * * Copyright (C) 1997 Geert Uytterhoeven * - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file COPYING in the main directory of this archive - * for more details. - * * This file is based on the following documentation: * * The Open Programmable Interrupt Controller (PIC) @@ -51,6 +47,16 @@ /* + * Vector numbers + */ + +#define OPENPIC_VEC_SOURCE 0x10 /* and up */ +#define OPENPIC_VEC_TIMER 0x40 /* and up */ +#define OPENPIC_VEC_IPI 0x50 /* and up */ +#define OPENPIC_VEC_SPURIOUS 99 + + + /* * OpenPIC Registers are 32 bits and aligned on 128 bit boundaries */ @@ -198,6 +204,8 @@ struct OpenPIC { }; extern volatile struct OpenPIC *OpenPIC; +extern u_int OpenPIC_NumInitSenses; +extern u_char *OpenPIC_InitSenses; /* diff --git a/include/linux/parport.h b/include/linux/parport.h index d03aca79f..269fb574c 100644 --- a/include/linux/parport.h +++ b/include/linux/parport.h @@ -1,4 +1,4 @@ -/* $Id: parport.h,v 1.6 1997/12/29 12:31:05 phil Exp $ */ +/* $Id: parport.h,v 1.1 1998/05/17 10:57:52 andrea Exp andrea $ */ #ifndef _PARPORT_H_ #define _PARPORT_H_ @@ -106,12 +106,18 @@ struct parport_operations { void (*release_resources)(struct parport *); int (*claim_resources)(struct parport *); + void (*epp_write_data)(struct parport *, unsigned char); + unsigned char (*epp_read_data)(struct parport *); + void (*epp_write_addr)(struct parport *, unsigned char); + unsigned char (*epp_read_addr)(struct parport *); + int (*epp_check_timeout)(struct parport *); size_t (*epp_write_block)(struct parport *, void *, size_t); size_t (*epp_read_block)(struct parport *, void *, size_t); int (*ecp_write_block)(struct parport *, void *, size_t, void (*fn)(struct parport *, void *, size_t), void *); int (*ecp_read_block)(struct parport *, void *, size_t, void (*fn)(struct parport *, void *, size_t), void *); + void (*init_state)(struct parport_state *); void (*save_state)(struct parport *, struct parport_state *); void (*restore_state)(struct parport *, struct parport_state *); @@ -121,14 +127,16 @@ struct parport_operations { void (*inc_use_count)(void); void (*dec_use_count)(void); + void (*fill_inode)(struct inode *inode, int fill); }; struct parport_device_info { parport_device_class class; - char *mfr; - char *model; - char *cmdset; - char *description; + const char *class_name; + const char *mfr; + const char *model; + const char *cmdset; + const char *description; }; /* Each device can have two callback functions: @@ -145,7 +153,7 @@ struct parport_device_info { /* A parallel port device */ struct pardevice { - char *name; + const char *name; struct parport *port; int (*preempt)(void *); void (*wakeup)(void *); @@ -177,7 +185,7 @@ struct parport_dir { struct parport { unsigned long base; /* base address */ unsigned int size; /* IO extent */ - char *name; + const char *name; int irq; /* interrupt (or -1 for none) */ int dma; unsigned int modes; @@ -329,6 +337,11 @@ extern void (*parport_probe_hook)(struct parport *port); #define parport_change_mode(p,m) parport_pc_change_mode(p,m) #define parport_release_resources(p) parport_pc_release_resources(p) #define parport_claim_resources(p) parport_pc_claim_resources(p) +#define parport_epp_write_data(p,x) parport_pc_write_epp(p,x) +#define parport_epp_read_data(p) parport_pc_read_epp(p) +#define parport_epp_write_addr(p,x) parport_pc_write_epp_addr(p,x) +#define parport_epp_read_addr(p) parport_pc_read_epp_addr(p) +#define parport_epp_check_timeout(p) parport_pc_check_epp_timeout(p) #endif #ifdef PARPORT_NEED_GENERIC_OPS @@ -348,6 +361,11 @@ extern void (*parport_probe_hook)(struct parport *port); #define parport_change_mode(p,m) (p)->ops->change_mode(p,m) #define parport_release_resources(p) (p)->ops->release_resources(p) #define parport_claim_resources(p) (p)->ops->claim_resources(p) +#define parport_epp_write_data(p,x) (p)->ops->epp_write_data(p,x) +#define parport_epp_read_data(p) (p)->ops->epp_read_data(p) +#define parport_epp_write_addr(p,x) (p)->ops->epp_write_addr(p,x) +#define parport_epp_read_addr(p) (p)->ops->epp_read_addr(p) +#define parport_epp_check_timeout(p) (p)->ops->epp_check_timeout(p) #endif #endif /* __KERNEL__ */ diff --git a/include/linux/parport_pc.h b/include/linux/parport_pc.h index 45f4c0fb8..b61a970a7 100644 --- a/include/linux/parport_pc.h +++ b/include/linux/parport_pc.h @@ -8,19 +8,41 @@ #define ECONTROL 0x402 #define CONFIGB 0x401 #define CONFIGA 0x400 -#define EPPREG 0x4 +#define EPPDATA 0x4 +#define EPPADDR 0x3 #define CONTROL 0x2 #define STATUS 0x1 #define DATA 0 +extern int parport_pc_epp_clear_timeout(struct parport *pb); + + extern __inline__ void parport_pc_write_epp(struct parport *p, unsigned char d) { - outb(d, p->base+EPPREG); + outb(d, p->base+EPPDATA); } extern __inline__ unsigned char parport_pc_read_epp(struct parport *p) { - return inb(p->base+EPPREG); + return inb(p->base+EPPDATA); +} + +extern __inline__ void parport_pc_write_epp_addr(struct parport *p, unsigned char d) +{ + outb(d, p->base+EPPADDR); +} + +extern __inline__ unsigned char parport_pc_read_epp_addr(struct parport *p) +{ + return inb(p->base+EPPADDR); +} + +extern __inline__ int parport_pc_check_epp_timeout(struct parport *p) +{ + if (!(inb(p->base+STATUS) & 1)) + return 0; + parport_pc_epp_clear_timeout(p); + return 1; } extern __inline__ unsigned char parport_pc_read_configb(struct parport *p) @@ -96,6 +118,8 @@ extern void parport_pc_release_resources(struct parport *p); extern int parport_pc_claim_resources(struct parport *p); +extern void parport_pc_init_state(struct parport_state *s); + extern void parport_pc_save_state(struct parport *p, struct parport_state *s); extern void parport_pc_restore_state(struct parport *p, struct parport_state *s); diff --git a/include/linux/pci.h b/include/linux/pci.h index 33e8d80ed..9217511f7 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -1,25 +1,17 @@ /* - * $Id: pci.h,v 1.70 1998/05/02 19:20:03 mj Exp $ + * $Id: pci.h,v 1.80 1998/07/21 10:06:40 mj Exp $ * * PCI defines and function prototypes * Copyright 1994, Drew Eckhardt - * Copyright 1997, Martin Mares <mj@atrey.karlin.mff.cuni.cz> + * Copyright 1997, 1998 Martin Mares <mj@atrey.karlin.mff.cuni.cz> * - * For more information, please consult - * - * PCI BIOS Specification Revision + * For more information, please consult the following manuals (look at + * http://www.pcisig.com/ for how to get them): + * + * PCI BIOS Specification * PCI Local Bus Specification + * PCI to PCI Bridge Specification * PCI System Design Guide - * - * PCI Special Interest Group - * M/S HF3-15A - * 5200 N.E. Elam Young Parkway - * Hillsboro, Oregon 97124-6497 - * +1 (503) 696-2000 - * +1 (800) 433-5177 - * - * Manuals are $25 each or $50 for all three, plus $7 shipping - * within the United States, $35 abroad. */ #ifndef LINUX_PCI_H @@ -84,7 +76,7 @@ * 1 bits are decoded. */ #define PCI_BASE_ADDRESS_0 0x10 /* 32 bits */ -#define PCI_BASE_ADDRESS_1 0x14 /* 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 */ @@ -153,17 +145,13 @@ #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) -- detailed info welcome */ -#define PCI_CB_CARDBUS_BASE 0x10 /* CardBus Socket/ExCa base address */ -#define PCI_CB_CARDBUS_BASE_TYPE_MASK 0xfff -#define PCI_CB_CARDBUS_BASE_MASK ~0xfff -#define PCI_CB_CAPABILITIES 0x14 /* Offset of list of capabilities in cfg space */ -/* 0x15 reserved */ +/* Header type 2 (CardBus bridges) */ +/* 0x14-0x15 reserved */ #define PCI_CB_SEC_STATUS 0x16 /* Secondary status */ -#define PCI_CB_BUS_NUMBER 0x18 /* PCI bus number */ -#define PCI_CB_CARDBUS_NUMBER 0x19 /* CardBus bus number */ +#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_CARDBUS_LATENCY 0x1b /* CardBus latency timer */ +#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 @@ -176,8 +164,19 @@ #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 */ -/* 0x3e-0x3f are same as for htype 1 */ +#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) */ @@ -573,6 +572,7 @@ #define PCI_DEVICE_ID_CMD_640 0x0640 #define PCI_DEVICE_ID_CMD_643 0x0643 #define PCI_DEVICE_ID_CMD_646 0x0646 +#define PCI_DEVICE_ID_CMD_647 0x0647 #define PCI_DEVICE_ID_CMD_670 0x0670 #define PCI_VENDOR_ID_VISION 0x1098 @@ -603,6 +603,7 @@ #define PCI_VENDOR_ID_MADGE 0x10b6 #define PCI_DEVICE_ID_MADGE_MK2 0x0002 +#define PCI_DEVICE_ID_MADGE_C155S 0x1001 #define PCI_VENDOR_ID_3COM 0x10b7 #define PCI_DEVICE_ID_3COM_3C339 0x3390 @@ -772,6 +773,11 @@ #define PCI_DEVICE_ID_ALLIANCE_AT24 0x6424 #define PCI_DEVICE_ID_ALLIANCE_AT3D 0x643d +#define PCI_VENDOR_ID_SK 0x1148 +#define PCI_DEVICE_ID_SK_FP 0x4000 +#define PCI_DEVICE_ID_SK_TR 0x4200 +#define PCI_DEVICE_ID_SK_GE 0x4300 + #define PCI_VENDOR_ID_VMIC 0x114a #define PCI_DEVICE_ID_VMIC_VME 0x7587 @@ -845,10 +851,15 @@ #define PCI_DEVICE_ID_COMPEX_RL2000 0x1401 #define PCI_VENDOR_ID_RP 0x11fe -#define PCI_DEVICE_ID_RP8OCTA 0x0001 +#define PCI_DEVICE_ID_RP32INTF 0x0001 #define PCI_DEVICE_ID_RP8INTF 0x0002 #define PCI_DEVICE_ID_RP16INTF 0x0003 -#define PCI_DEVICE_ID_RP32INTF 0x0004 +#define PCI_DEVICE_ID_RP4QUAD 0x0004 +#define PCI_DEVICE_ID_RP8OCTA 0x0005 +#define PCI_DEVICE_ID_RP8J 0x0006 +#define PCI_DEVICE_ID_RPP4 0x000A +#define PCI_DEVICE_ID_RPP8 0x000B +#define PCI_DEVICE_ID_RP8M 0x000C #define PCI_VENDOR_ID_CYCLADES 0x120e #define PCI_DEVICE_ID_CYCLOM_Y_Lo 0x0100 @@ -895,6 +906,9 @@ #define PCI_VENDOR_ID_ENSONIQ 0x1274 #define PCI_DEVICE_ID_ENSONIQ_AUDIOPCI 0x5000 +#define PCI_VENDOR_ID_ALTEON 0x12ae +#define PCI_DEVICE_ID_ALTEON_ACENIC 0x0001 + #define PCI_VENDOR_ID_PICTUREL 0x12c5 #define PCI_DEVICE_ID_PICTUREL_PCIVST 0x0081 @@ -1036,43 +1050,7 @@ #ifdef __KERNEL__ #include <linux/types.h> - -/* - * Error values that may be returned by the PCI bios. - */ -#define PCIBIOS_SUCCESSFUL 0x00 -#define PCIBIOS_FUNC_NOT_SUPPORTED 0x81 -#define PCIBIOS_BAD_VENDOR_ID 0x83 -#define PCIBIOS_DEVICE_NOT_FOUND 0x86 -#define PCIBIOS_BAD_REGISTER_NUMBER 0x87 -#define PCIBIOS_SET_FAILED 0x88 -#define PCIBIOS_BUFFER_TOO_SMALL 0x89 - -/* Direct configuration space access */ - -int pcibios_present (void); -void pcibios_init(void); -void pcibios_fixup(void); -char *pcibios_setup (char *str); -int pcibios_read_config_byte (unsigned char bus, unsigned char dev_fn, - unsigned char where, unsigned char *val); -int pcibios_read_config_word (unsigned char bus, unsigned char dev_fn, - unsigned char where, unsigned short *val); -int pcibios_read_config_dword (unsigned char bus, unsigned char dev_fn, - unsigned char where, unsigned int *val); -int pcibios_write_config_byte (unsigned char bus, unsigned char dev_fn, - unsigned char where, unsigned char val); -int pcibios_write_config_word (unsigned char bus, unsigned char dev_fn, - unsigned char where, unsigned short val); -int pcibios_write_config_dword (unsigned char bus, unsigned char dev_fn, - unsigned char where, unsigned int val); - -/* Don't use these in new code, use pci_find_... instead */ - -int pcibios_find_class (unsigned int class_code, unsigned short index, unsigned char *bus, unsigned char *dev_fn); -int pcibios_find_device (unsigned short vendor, unsigned short dev_id, - unsigned short index, unsigned char *bus, - unsigned char *dev_fn); +#include <linux/config.h> /* * There is one pci_dev structure for each slot-number/function-number @@ -1084,6 +1062,7 @@ struct pci_dev { struct pci_dev *next; /* chain of all devices */ void *sysdata; /* hook for sys-specific extension */ + struct proc_dir_entry *procent; /* device entry in /proc/bus/pci */ unsigned int devfn; /* encoded device & function index */ unsigned short vendor; @@ -1120,6 +1099,7 @@ struct pci_bus { struct pci_dev *devices; /* devices behind this bridge */ void *sysdata; /* hook for sys-specific extension */ + struct proc_dir_entry *procdir; /* directory entry in /proc/bus/pci */ unsigned char number; /* bus number */ unsigned char primary; /* number of primary bridge */ @@ -1130,6 +1110,46 @@ struct pci_bus { extern struct pci_bus pci_root; /* root bus */ extern struct pci_dev *pci_devices; /* list of all devices */ +/* + * Error values that may be returned by the PCI bios. + */ +#define PCIBIOS_SUCCESSFUL 0x00 +#define PCIBIOS_FUNC_NOT_SUPPORTED 0x81 +#define PCIBIOS_BAD_VENDOR_ID 0x83 +#define PCIBIOS_DEVICE_NOT_FOUND 0x86 +#define PCIBIOS_BAD_REGISTER_NUMBER 0x87 +#define PCIBIOS_SET_FAILED 0x88 +#define PCIBIOS_BUFFER_TOO_SMALL 0x89 + +/* Low-level architecture-dependent routines */ + +int pcibios_present (void); +void pcibios_init(void); +void pcibios_fixup(void); +void pcibios_fixup_bus(struct pci_bus *); +char *pcibios_setup (char *str); +int pcibios_read_config_byte (unsigned char bus, unsigned char dev_fn, + unsigned char where, unsigned char *val); +int pcibios_read_config_word (unsigned char bus, unsigned char dev_fn, + unsigned char where, unsigned short *val); +int pcibios_read_config_dword (unsigned char bus, unsigned char dev_fn, + unsigned char where, unsigned int *val); +int pcibios_write_config_byte (unsigned char bus, unsigned char dev_fn, + unsigned char where, unsigned char val); +int pcibios_write_config_word (unsigned char bus, unsigned char dev_fn, + unsigned char where, unsigned short val); +int pcibios_write_config_dword (unsigned char bus, unsigned char dev_fn, + unsigned char where, unsigned int val); + +/* Don't use these in new code, use pci_find_... instead */ + +int pcibios_find_class (unsigned int class_code, unsigned short index, unsigned char *bus, unsigned char *dev_fn); +int pcibios_find_device (unsigned short vendor, unsigned short dev_id, + unsigned short index, unsigned char *bus, + unsigned char *dev_fn); + +/* Generic PCI interface functions */ + void pci_init(void); void pci_setup(char *str, int *ints); void pci_quirks_init(void); @@ -1137,6 +1157,8 @@ unsigned int pci_scan_bus(struct pci_bus *bus); void pci_proc_init(void); void proc_old_pci_init(void); int get_pci_list(char *buf); +int pci_proc_attach_device(struct pci_dev *dev); +int pci_proc_detach_device(struct pci_dev *dev); struct pci_dev *pci_find_device (unsigned int vendor, unsigned int device, struct pci_dev *from); struct pci_dev *pci_find_class (unsigned int class, struct pci_dev *from); @@ -1151,5 +1173,32 @@ int pci_write_config_word(struct pci_dev *dev, u8 where, u16 val); int pci_write_config_dword(struct pci_dev *dev, u8 where, u32 val); void pci_set_master(struct pci_dev *dev); +#ifndef CONFIG_PCI +/* If the system does not have PCI, clearly these return errors. Define + these as simple inline functions to avoid hair in drivers. */ +extern inline int pcibios_present(void) { return 0; } + +#define _PCI_NOP(o,s,t) \ + extern inline int pcibios_##o##_config_##s## (u8 bus, u8 dfn, u8 where, t val) \ + { return PCIBIOS_FUNC_NOT_SUPPORTED; } \ + extern inline int pci_##o##_config_##s## (struct pci_dev *dev, u8 where, t val) \ + { return PCIBIOS_FUNC_NOT_SUPPORTED; } +#define _PCI_NOP_ALL(o,x) _PCI_NOP(o,byte,u8 x) \ + _PCI_NOP(o,word,u16 x) \ + _PCI_NOP(o,dword,u32 x) +_PCI_NOP_ALL(read, *) +_PCI_NOP_ALL(write,) + +extern inline struct pci_dev *pci_find_device(unsigned int vendor, unsigned int device, struct pci_dev *from) +{ return NULL; } + +extern inline struct pci_dev *pci_find_class(unsigned int class, struct pci_dev *from) +{ return NULL; } + +extern inline struct pci_dev *pci_find_slot(unsigned int bus, unsigned int devfn) +{ return NULL; } + +#endif /* !CONFIG_PCI */ + #endif /* __KERNEL__ */ #endif /* LINUX_PCI_H */ diff --git a/include/linux/personality.h b/include/linux/personality.h index 67233278a..a927b9e71 100644 --- a/include/linux/personality.h +++ b/include/linux/personality.h @@ -23,9 +23,10 @@ #define PER_ISCR4 (0x0005 | STICKY_TIMEOUTS) #define PER_BSD (0x0006) #define PER_XENIX (0x0007 | STICKY_TIMEOUTS) -#define PER_IRIX32 (0x0008 | STICKY_TIMEOUTS) /* IRIX5 32-bit */ -#define PER_IRIXN32 (0x0009 | STICKY_TIMEOUTS) /* IRIX6 new 32-bit */ -#define PER_IRIX64 (0x000a | STICKY_TIMEOUTS) /* IRIX6 64-bit */ +#define PER_LINUX32 (0x0008) +#define PER_IRIX32 (0x0009 | STICKY_TIMEOUTS) /* IRIX5 32-bit */ +#define PER_IRIXN32 (0x000a | STICKY_TIMEOUTS) /* IRIX6 new 32-bit */ +#define PER_IRIX64 (0x000b | STICKY_TIMEOUTS) /* IRIX6 64-bit */ /* Prototype for an lcall7 syscall handler. */ typedef void (*lcall7_func)(struct pt_regs *); diff --git a/include/linux/pg.h b/include/linux/pg.h new file mode 100644 index 000000000..c752a97ca --- /dev/null +++ b/include/linux/pg.h @@ -0,0 +1,63 @@ +/* pg.h (c) 1998 Grant R. Guenther <grant@torque.net> + Under the terms of the GNU public license + + + pg.h defines the user interface to the generic ATAPI packet + command driver for parallel port ATAPI devices (pg). The + driver is loosely modelled after the generic SCSI driver, sg, + although the actual interface is different. + + The pg driver provides a simple character device interface for + sending ATAPI commands to a device. With the exception of the + ATAPI reset operation, all operations are performed by a pair + of read and write operations to the appropriate /dev/pgN device. + A write operation delivers a command and any outbound data in + a single buffer. Normally, the write will succeed unless the + device is offline or malfunctioning, or there is already another + command pending. If the write succeeds, it should be followed + immediately by a read operation, to obtain any returned data and + status information. A read will fail if there is no operation + in progress. + + As a special case, the device can be reset with a write operation, + and in this case, no following read is expected, or permitted. + + There are no ioctl() operations. Any single operation + may transfer at most PG_MAX_DATA bytes. Note that the driver must + copy the data through an internal buffer. In keeping with all + current ATAPI devices, command packets are assumed to be exactly + 12 bytes in length. + + To permit future changes to this interface, the headers in the + read and write buffers contain a single character "magic" flag. + Currently this flag must be the character "P". + +*/ + +#define PG_MAGIC 'P' +#define PG_RESET 'Z' +#define PG_COMMAND 'C' + +#define PG_MAX_DATA 32768 + +struct pg_write_hdr { + + char magic; /* == PG_MAGIC */ + char func; /* PG_RESET or PG_COMMAND */ + int dlen; /* number of bytes expected to transfer */ + int timeout; /* number of seconds before timeout */ + char packet[12]; /* packet command */ + +}; + +struct pg_read_hdr { + + char magic; /* == PG_MAGIC */ + char scsi; /* "scsi" status == sense key */ + int dlen; /* size of device transfer request */ + int duration; /* time in seconds command took */ + char pad[12]; /* not used */ + +}; + +/* end of pg.h */ diff --git a/include/linux/poll.h b/include/linux/poll.h index b849b5751..c4065bc12 100644 --- a/include/linux/poll.h +++ b/include/linux/poll.h @@ -79,8 +79,8 @@ int get_fd_set(unsigned long nr, void *ufdset, unsigned long *fdset) if (ufdset) { int error; error = verify_area(VERIFY_WRITE, ufdset, nr); - if (!error) - error = __copy_from_user(fdset, ufdset, nr); + if (!error && __copy_from_user(fdset, ufdset, nr)) + error = -EFAULT; return error; } memset(fdset, 0, nr); diff --git a/include/linux/proc_fs.h b/include/linux/proc_fs.h index b0d678156..8cde8f833 100644 --- a/include/linux/proc_fs.h +++ b/include/linux/proc_fs.h @@ -31,6 +31,7 @@ enum root_directory_inos { PROC_MODULES, PROC_STAT, PROC_DEVICES, + PROC_PARTITIONS, PROC_INTERRUPTS, PROC_FILESYSTEMS, PROC_KSYMS, @@ -44,11 +45,11 @@ enum root_directory_inos { PROC_MD, PROC_RTC, PROC_LOCKS, - PROC_ZORRO, PROC_HARDWARE, PROC_SLABINFO, PROC_PARPORT, PROC_PPC_HTAB, + PROC_STRAM, PROC_SOUND, PROC_MTRR, /* whether enabled or not */ PROC_FS @@ -74,7 +75,7 @@ enum pid_directory_inos { }; enum pid_subdirectory_inos { - PROC_PID_FD_DIR = 1 + PROC_PID_FD_DIR = 0x8000, /* 0x8000-0xffff */ }; enum net_directory_inos { @@ -108,6 +109,7 @@ enum net_directory_inos { PROC_NET_AX25_ROUTE, PROC_NET_AX25, PROC_NET_AX25_CALLS, + PROC_NET_BMAC, PROC_NET_NR_NODES, PROC_NET_NR_NEIGH, PROC_NET_NR, @@ -135,8 +137,11 @@ enum net_directory_inos { PROC_NET_DN_ADJ, PROC_NET_DN_L1, PROC_NET_DN_L2, + PROC_NET_DN_CACHE, PROC_NET_DN_SKT, PROC_NET_NETSTAT, + PROC_NET_IPFW_CHAINS, + PROC_NET_IPFW_CHAIN_NAMES, PROC_NET_LAST }; @@ -177,10 +182,13 @@ enum scsi_directory_inos { PROC_SCSI_ESP, PROC_SCSI_QLOGICPTI, PROC_SCSI_AMIGA7XX, + PROC_SCSI_MVME16x, + PROC_SCSI_BVME6000, PROC_SCSI_A3000, PROC_SCSI_A2091, PROC_SCSI_GVP11, PROC_SCSI_ATARI, + PROC_SCSI_MAC, PROC_SCSI_IDESCSI, PROC_SCSI_SGIWD93, PROC_SCSI_MESH, @@ -204,16 +212,18 @@ enum mca_directory_inos { enum bus_directory_inos { PROC_BUS_PCI = PROC_MCA_LAST, PROC_BUS_PCI_DEVICES, + PROC_BUS_ZORRO, + PROC_BUS_ZORRO_DEVICES, PROC_BUS_LAST }; enum fs_directory_inos { - PROC_FS_CODA = PROC_MCA_LAST, + PROC_FS_CODA = PROC_BUS_LAST, PROC_FS_LAST }; enum fs_coda_directory_inos { - PROC_VFS_STATS = PROC_MCA_LAST, + PROC_VFS_STATS = PROC_FS_LAST, PROC_UPCALL_STATS, PROC_PERMISSION_STATS, PROC_CACHE_INV_STATS, @@ -279,6 +289,7 @@ extern int (* dispatch_scsi_info_ptr) (int ino, char *buffer, char **start, off_t offset, int length, int inout); extern struct proc_dir_entry proc_root; +extern struct proc_dir_entry proc_root_fs; extern struct proc_dir_entry *proc_net; extern struct proc_dir_entry *proc_scsi; extern struct proc_dir_entry proc_sys; diff --git a/include/linux/quota.h b/include/linux/quota.h index 4c4de4eca..014685f4f 100644 --- a/include/linux/quota.h +++ b/include/linux/quota.h @@ -33,7 +33,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * Version: $Id: quota.h,v 1.8 1995/03/11 11:43:07 mvw Exp mvw $ + * Version: $Id: quota.h,v 2.0 1996/11/17 16:48:14 mvw Exp mvw $ */ #ifndef _LINUX_QUOTA_ @@ -43,7 +43,6 @@ /* * Convert diskblocks to blocks and the other way around. - * currently only to fool the BSD source. :-) */ #define dbtob(num) (num << 10) #define btodb(num) (num >> 10) @@ -74,16 +73,20 @@ * Definitions for the default names of the quotas files. */ #define INITQFNAMES { \ - "user", /* USRQUOTA */ \ - "group", /* GRPQUOTA */ \ - "undefined", \ + "user", /* USRQUOTA */ \ + "group", /* GRPQUOTA */ \ + "undefined", \ }; #define QUOTAFILENAME "quota" #define QUOTAGROUP "staff" -#define NR_DQHASH 43 /* Just an arbitrary number any suggestions ? */ -#define NR_DQUOTS 256 /* Number of quotas active at one time */ +extern int nr_dquots, nr_free_dquots; +extern int max_dquots; +extern int dquot_root_squash; + +#define NR_DQHASH 43 /* Just an arbitrary number */ +#define NR_DQUOTS 256 /* Maximum number of quotas active at one time (Configurable from /proc/sys/fs) */ /* * Command definitions for the 'quotactl' system call. @@ -103,6 +106,7 @@ #define Q_SYNC 0x0600 /* sync disk copy of a filesystems quotas */ #define Q_SETQLIM 0x0700 /* set limits */ #define Q_GETSTATS 0x0800 /* get collected stats */ +#define Q_RSQUASH 0x1000 /* set root_squash option */ /* * The following structure defines the format of the disk quota file @@ -110,14 +114,14 @@ * indexed by user or group number. */ struct dqblk { - __u32 dqb_bhardlimit; /* absolute limit on disk blks alloc */ - __u32 dqb_bsoftlimit; /* preferred limit on disk blks */ - __u32 dqb_curblocks; /* current block count */ - __u32 dqb_ihardlimit; /* maximum # allocated inodes */ - __u32 dqb_isoftlimit; /* preferred inode limit */ - __u32 dqb_curinodes; /* current # allocated inodes */ - time_t dqb_btime; /* time limit for excessive disk use */ - time_t dqb_itime; /* time limit for excessive files */ + __u32 dqb_bhardlimit; /* absolute limit on disk blks alloc */ + __u32 dqb_bsoftlimit; /* preferred limit on disk blks */ + __u32 dqb_curblocks; /* current block count */ + __u32 dqb_ihardlimit; /* absolute limit on allocated inodes */ + __u32 dqb_isoftlimit; /* preferred inode limit */ + __u32 dqb_curinodes; /* current # allocated inodes */ + time_t dqb_btime; /* time limit for excessive disk use */ + time_t dqb_itime; /* time limit for excessive inode use */ }; /* @@ -135,21 +139,18 @@ struct dqblk { #define dqoff(UID) ((loff_t)((UID) * sizeof (struct dqblk))) struct dqstats { - __u32 lookups; - __u32 drops; - __u32 reads; - __u32 writes; - __u32 cache_hits; - __u32 pages_allocated; - __u32 allocated_dquots; - __u32 free_dquots; - __u32 syncs; + __u32 lookups; + __u32 drops; + __u32 reads; + __u32 writes; + __u32 cache_hits; + __u32 allocated_dquots; + __u32 free_dquots; + __u32 syncs; }; #ifdef __KERNEL__ -#include <linux/mount.h> - /* * Maximum length of a message generated in the quota system, * that needs to be kicked onto the tty. @@ -164,18 +165,19 @@ struct dqstats { #define DQ_FAKE 0x40 /* no limits only usage */ struct dquot { - unsigned int dq_id; /* id this applies to (uid, gid) */ - short dq_type; /* type of quota */ - kdev_t dq_dev; /* Device this applies to */ - short dq_flags; /* see DQ_* */ - short dq_count; /* reference count */ - struct vfsmount *dq_mnt; /* vfsmountpoint this applies to */ - struct dqblk dq_dqb; /* diskquota usage */ - struct wait_queue *dq_wait; /* pointer to waitqueue */ - struct dquot *dq_prev; /* pointer to prev dquot */ - struct dquot *dq_next; /* pointer to next dquot */ - struct dquot *dq_hash_prev; /* pointer to prev dquot */ - struct dquot *dq_hash_next; /* pointer to next dquot */ + unsigned int dq_id; /* ID this applies to (uid, gid) */ + short dq_type; /* Type of quota */ + kdev_t dq_dev; /* Device this applies to */ + short dq_flags; /* See DQ_* */ + short dq_count; /* Reference count */ + unsigned long dq_referenced; /* Number of times this dquot was referenced during its lifetime */ + struct vfsmount *dq_mnt; /* VFS_mount_point this applies to */ + struct dqblk dq_dqb; /* Diskquota usage */ + struct wait_queue *dq_wait; /* Pointer to waitqueue */ + struct dquot *dq_next; /* Pointer to next dquot */ + struct dquot *dq_hash_next; /* Pointer to next in dquot_hash */ + struct dquot **dq_hash_pprev; /* Pointer to previous in dquot_hash */ + struct dquot **dq_pprev; }; #define NODQUOT (struct dquot *)NULL @@ -191,22 +193,6 @@ struct dquot { #define QUOTA_OK 0 #define NO_QUOTA 1 -/* - * declaration of quota_function calls in kernel. - */ - -extern void dquot_initialize(struct inode *inode, short type); -extern void dquot_drop(struct inode *inode); -extern int dquot_alloc_block(const struct inode *inode, unsigned long number); -extern int dquot_alloc_inode(const struct inode *inode, unsigned long number); -extern void dquot_free_block(const struct inode *inode, unsigned long number); -extern void dquot_free_inode(const struct inode *inode, unsigned long number); -extern int dquot_transfer(struct inode *inode, struct iattr *iattr, char direction); - -extern void invalidate_dquots(kdev_t dev, short type); -extern int quota_off(kdev_t dev, short type); -extern int sync_dquots(kdev_t dev, short type); - #else # /* nodep */ include <sys/cdefs.h> diff --git a/include/linux/quotaops.h b/include/linux/quotaops.h new file mode 100644 index 000000000..a2a00a04c --- /dev/null +++ b/include/linux/quotaops.h @@ -0,0 +1,140 @@ +/* + * Definitions for diskquota-operations. When diskquota is configured these + * macros expand to the right source-code. + * + * Author: Marco van Wieringen <mvw@planets.elm.net> + * + * Version: $Id: quotaops.h,v 1.2 1998/01/15 16:22:26 ecd Exp $ + * + */ +#ifndef _LINUX_QUOTAOPS_ +#define _LINUX_QUOTAOPS_ + +#include <linux/config.h> + +#if defined(CONFIG_QUOTA) + +/* + * declaration of quota_function calls in kernel. + */ +extern void dquot_initialize(struct inode *inode, short type); +extern void dquot_drop(struct inode *inode); +extern void invalidate_dquots(kdev_t dev, short type); +extern int quota_off(kdev_t dev, short type); +extern int sync_dquots(kdev_t dev, short type); + +extern int dquot_alloc_block(const struct inode *inode, unsigned long number, + uid_t initiator, char warn); +extern int dquot_alloc_inode(const struct inode *inode, unsigned long number, + uid_t initiator); + +extern void dquot_free_block(const struct inode *inode, unsigned long number); +extern void dquot_free_inode(const struct inode *inode, unsigned long number); + +extern int dquot_transfer(struct inode *inode, struct iattr *iattr, + char direction, uid_t initiator); + +/* + * Operations supported for diskquotas. + */ +extern __inline__ void DQUOT_INIT(struct inode *inode) +{ + if (inode->i_sb && inode->i_sb->dq_op) + inode->i_sb->dq_op->initialize(inode, -1); +} + +extern __inline__ void DQUOT_DROP(struct inode *inode) +{ + if (IS_QUOTAINIT(inode)) { + if (inode->i_sb && inode->i_sb->dq_op) + inode->i_sb->dq_op->drop(inode); + } +} + +extern __inline__ int DQUOT_PREALLOC_BLOCK(struct super_block *sb, const struct inode *inode, int nr) +{ + if (sb->dq_op) { + if (sb->dq_op->alloc_block(inode, fs_to_dq_blocks(nr, sb->s_blocksize), + current->euid, 0) == NO_QUOTA) + return 1; + } + return 0; +} + +extern __inline__ int DQUOT_ALLOC_BLOCK(struct super_block *sb, const struct inode *inode, int nr) +{ + if (sb->dq_op) { + if (sb->dq_op->alloc_block(inode, fs_to_dq_blocks(nr, sb->s_blocksize), + current->euid, 1) == NO_QUOTA) + return 1; + } + return 0; +} + +extern __inline__ int DQUOT_ALLOC_INODE(struct super_block *sb, struct inode *inode) +{ + if (sb->dq_op) { + sb->dq_op->initialize (inode, -1); + if (sb->dq_op->alloc_inode (inode, 1, current->euid)) + return 1; + } + inode->i_flags |= S_QUOTA; + return 0; +} + +extern __inline__ void DQUOT_FREE_BLOCK(struct super_block *sb, const struct inode *inode, int nr) +{ + if (sb->dq_op) + sb->dq_op->free_block(inode, fs_to_dq_blocks(nr, sb->s_blocksize)); +} + +extern __inline__ void DQUOT_FREE_INODE(struct super_block *sb, struct inode *inode) +{ + if (sb->dq_op) + sb->dq_op->free_inode(inode, 1); +} + +extern __inline__ int DQUOT_TRANSFER(struct dentry *dentry, struct iattr *iattr) +{ + int error = -EDQUOT; + + if (dentry->d_inode->i_sb->dq_op) { + if (IS_QUOTAINIT(dentry->d_inode) == 0) + dentry->d_inode->i_sb->dq_op->initialize(dentry->d_inode, -1); + if (dentry->d_inode->i_sb->dq_op->transfer(dentry->d_inode, iattr, 0, current->euid)) + goto out; + error = notify_change(dentry, iattr); + if (error) + dentry->d_inode->i_sb->dq_op->transfer(dentry->d_inode, iattr, 1, current->euid); + } else { + error = notify_change(dentry, iattr); + } +out: + return error; +} + +#define DQUOT_SYNC(dev) sync_dquots(dev, -1) +#define DQUOT_OFF(dev) quota_off(dev, -1) + +#else + +/* + * NO-OP when quota not configured. + */ +#define DQUOT_INIT(inode) do { } while(0) +#define DQUOT_DROP(inode) do { } while(0) +#define DQUOT_PREALLOC_BLOCK(sb, inode, nr) (0) +#define DQUOT_ALLOC_BLOCK(sb, inode, nr) (0) +#define DQUOT_ALLOC_INODE(sb, inode) (0) +#define DQUOT_FREE_BLOCK(sb, inode, nr) do { } while(0) +#define DQUOT_FREE_INODE(sb, inode) do { } while(0) +#define DQUOT_SYNC(dev) do { } while(0) +#define DQUOT_OFF(dev) do { } while(0) + +/* + * Special case expands to a simple notify_change. + */ +#define DQUOT_TRANSFER(dentry, iattr) notify_change(dentry, iattr) + +#endif /* CONFIG_QUOTA */ +#endif /* _LINUX_QUOTAOPS_ */ diff --git a/include/linux/radio.h b/include/linux/radio.h deleted file mode 100644 index 5d6a88537..000000000 --- a/include/linux/radio.h +++ /dev/null @@ -1,134 +0,0 @@ -/* - * linux/radio.h - * - * Include for radio card support under linux - * Another pointless suid-binary removal utility... :-) - */ - -#ifndef _LINUX_RADIO_H -#define _LINUX_RADIO_H - -#include <linux/ioctl.h> - -/* - * Constants - */ -/* Various types of Radio card... */ -/* (NB. I've made this a bit-field. It might make the difference one day.) */ -#define RADIO_TYPE_UNSUP 0x0000 -#define RADIO_TYPE_RTRACK 0x0001 /* AIMSlab RadioTrack (RadioReveal) card -- basic, to say the least */ -#define RADIO_TYPE_WINRADIO 0x0002 /* Dunno, but made by someone */ -#define RADIO_TYPE_TYPHOON 0x0004 /* It exists... */ - -/* waveband types */ -#define RADIO_PROTOCOL_AM 0x0010 /* AM "protocol" */ -#define RADIO_PROTOCOL_FM 0x0020 /* FM "protocol" */ -#define RADIO_PROTOCOL_SSB 0x0040 /* SSB */ -/* and no doubt some other stuff, too (Brian?) */ - - -/* the following are _very_ inaccurate; essentially, all that - * they do is provide a "name" for client programs - */ -#define RADIO_BAND_UNKNOWN 0x0000 /* other */ -#define RADIO_BAND_AM_SW 0x0100 /* short wave (?) */ -#define RADIO_BAND_AM_MW 0x0200 /* medium wave (540 - 1600) */ -#define RADIO_BAND_AM_LW 0x0400 /* long wave (150 - 270) */ -#define RADIO_BAND_FM_STD 0x1000 /* "standard" FM band (i.e. 88 - 108 or so) */ - - -/* Since floating-point stuff is illegal in the kernel, we use these - * pairs of macros to convert to, and from userland floats - * (I hope these are general enough!) - */ -/* Remember to make sure that all of these are integral... */ -/* Also remember to pass sensible things in here (MHz for FM, kHz for AM) */ -#define RADIO_FM_RES 100 /* 0.01 MHZ */ -#define RADIO_FM_FRTOINT(fl) ((int)(((float)(fl))*RADIO_FM_RES)) -#define RADIO_FM_INTTOFR(fr) ((float)(((int)(fr))/RADIO_FM_RES)) - -/* Old RadioTrack definitions -#define RADIO_FM_FRTOINT(fl) ((int)(((float)(fl)-88.0)*40)+0xf6c) -#define RADIO_FM_INTTOFR(fr) ((float)(((fr)-0xf6c)/40)+88.0) -*/ - -#define RADIO_AM_RES 1 /* 1 kHz */ -#define RADIO_AM_FRTOINT(fl) ((int)(((float)(fl))*RADIO_AM_RES)) -#define RADIO_AM_INTTOFR(fr) ((float)(((int)(fr))/RADIO_AM_RES)) - - -/* - * Structures - */ -/* query structures */ -struct radio_cap { - int dev_num; /* device index */ - int type; /* device type (see above) */ - int num_bwidths; /* number of "bandwidths" supported */ - int volmin, volmax; /* min/max in steps of one */ -}; - -struct radio_band { - int dev_num; /* device index (IN) */ - int index; /* "bandwidth" index (IN) */ - int proto; /* protocol (AM, FM, SSB, etc) (OUT) */ - int types; /* see RADIO_BAND_* above */ - int freqmin,freqmax; /* encoded according to the macros above */ - int strmin,strmax; /* min/max signal strength (steps of 1) */ -}; - -/* Previously, this was in four separate structures: - * radio_vol, radio_freq, radio_band and radio_sigstr, - * That was foolish, but now it's not so obvious what's going on. - * Be careful. - */ - -struct radio_ctl { - int dev_num; /* device index (IN) */ - int value; /* volume, frequency, band, sigstr */ -}; - - -/* - * ioctl numbers - */ -/* You have _how_ many radio devices? =) */ -#define RADIO_NUMDEVS _IOR(0x8c, 0x00, int) -#define RADIO_GETCAPS _IOR(0x8c, 0x01, struct radio_cap) -#define RADIO_GETBNDCAP _IOR(0x8c, 0x02, struct radio_band) - -#define RADIO_SETVOL _IOW(0x8c, 0x10, struct radio_ctl) -#define RADIO_GETVOL _IOR(0x8c, 0x11, struct radio_ctl) -#define RADIO_SETBAND _IOW(0x8c, 0x12, struct radio_ctl) -#define RADIO_GETBAND _IOR(0x8c, 0x13, struct radio_ctl) -#define RADIO_SETFREQ _IOW(0x8c, 0x14, struct radio_ctl) -#define RADIO_GETFREQ _IOR(0x8c, 0x15, struct radio_ctl) - -#define RADIO_GETSIGSTR _IOR(0x8c, 0x30, struct radio_ctl) - -/* kernel specific stuff... */ -#ifdef __KERNEL__ -/* Try to keep the number of function pointers to a minimum. - * Devices are responsible for updating, or otherwise, the - * variables here, not the outside wrapper. - */ -struct radio_device; - -int radio_add_device(struct radio_device *newdev); - -struct radio_device { - struct radio_cap *cap; - struct radio_band *bands; /* pointer to array of radio_bands */ - int (*setvol)(struct radio_device*,int); - int curvol; - int (*setband)(struct radio_device*,int); - int curband; - int (*setfreq)(struct radio_device*,int); - int curfreq; - int (*getsigstr)(struct radio_device*); - struct radio_device *next; - void *misc; /* device internal storage... (eg i/o addresses, etc */ -}; -#endif /* __KERNEL__ */ - -#endif /* _LINUX_RADIO_H */ diff --git a/include/linux/raid1.h b/include/linux/raid1.h index 2f4e525b8..4b031e682 100644 --- a/include/linux/raid1.h +++ b/include/linux/raid1.h @@ -37,8 +37,8 @@ struct raid1_data { struct raid1_bh { unsigned int remaining; - unsigned int state; int cmd; + unsigned long state; struct md_dev *mddev; struct buffer_head *master_bh; struct buffer_head *mirror_bh [MD_SB_DISKS]; diff --git a/include/linux/raid5.h b/include/linux/raid5.h index 214f49de1..5efd211a2 100644 --- a/include/linux/raid5.h +++ b/include/linux/raid5.h @@ -30,7 +30,7 @@ struct stripe_head { int size; /* buffers size */ int pd_idx; /* parity disk index */ int nr_pending; /* nr of pending cmds */ - __u32 state; /* state flags */ + unsigned long state; /* state flags */ int cmd; /* stripe cmd */ int count; /* nr of waiters */ int write_method; /* reconstruct-write / read-modify-write */ diff --git a/include/linux/random.h b/include/linux/random.h index 7be5e9898..58c93b9b6 100644 --- a/include/linux/random.h +++ b/include/linux/random.h @@ -56,7 +56,13 @@ extern void get_random_bytes(void *buf, int nbytes); extern __u32 secure_tcp_sequence_number(__u32 saddr, __u32 daddr, __u16 sport, __u16 dport); extern __u32 secure_tcp_syn_cookie(__u32 saddr, __u32 daddr, - __u16 sport, __u16 dport, __u32 sseq, __u32 count); + __u16 sport, __u16 dport, + __u32 sseq, __u32 count, + __u32 data); +extern __u32 check_tcp_syn_cookie(__u32 cookie, __u32 saddr, + __u32 daddr, __u16 sport, + __u16 dport, __u32 sseq, + __u32 count, __u32 maxdiff); #ifndef MODULE extern struct file_operations random_fops, urandom_fops; diff --git a/include/linux/rtnetlink.h b/include/linux/rtnetlink.h index b0efb81a9..4c8adc508 100644 --- a/include/linux/rtnetlink.h +++ b/include/linux/rtnetlink.h @@ -658,7 +658,7 @@ extern __inline__ void rtnl_shunlock(void) atomic_dec(&rtnl_rlockct); if (atomic_read(&rtnl_rlockct) <= 1) { wake_up(&rtnl_wait); - if (rtnl->receive_queue.qlen) + if (rtnl && rtnl->receive_queue.qlen) rtnl->data_ready(rtnl, 0); } } @@ -672,7 +672,7 @@ extern __inline__ void rtnl_shunlock(void) atomic_dec(&rtnl_rlockct); \ if (atomic_read(&rtnl_rlockct) <= 1) { \ wake_up(&rtnl_wait); \ - if (rtnl->receive_queue.qlen) \ + if (rtnl && rtnl->receive_queue.qlen) \ rtnl->data_ready(rtnl, 0); \ } \ }) diff --git a/include/linux/sched.h b/include/linux/sched.h index 8666a6460..7c9112136 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -32,6 +32,7 @@ extern unsigned long event; #define CLONE_FILES 0x00000400 /* set if open files shared between processes */ #define CLONE_SIGHAND 0x00000800 /* set if signal handlers shared */ #define CLONE_PID 0x00001000 /* set if pid shared */ +#define CLONE_PTRACE 0x00002000 /* set if we want to let tracing continue on the child too */ /* * These are the constant used to fake the fixed-point load-average @@ -126,7 +127,7 @@ asmlinkage void schedule(void); * Open file table structure */ struct files_struct { - int count; + atomic_t count; int max_fds; struct file ** fd; /* current fd array */ fd_set close_on_exec; @@ -134,7 +135,7 @@ struct files_struct { }; #define INIT_FILES { \ - 1, \ + ATOMIC_INIT(1), \ NR_OPEN, \ &init_fd_array[0], \ { { 0, } }, \ @@ -142,13 +143,13 @@ struct files_struct { } struct fs_struct { - int count; + atomic_t count; int umask; struct dentry * root, * pwd; }; #define INIT_FS { \ - 1, \ + ATOMIC_INIT(1), \ 0022, \ NULL, NULL \ } @@ -159,7 +160,8 @@ struct fs_struct { struct mm_struct { struct vm_area_struct *mmap, *mmap_cache; pgd_t * pgd; - int count, map_count; + atomic_t count; + int map_count; struct semaphore mmap_sem; unsigned long context; unsigned long start_code, end_code, start_data, end_data; @@ -176,7 +178,8 @@ struct mm_struct { }; #define INIT_MM { \ - &init_mmap, NULL, swapper_pg_dir, 1, 1, \ + &init_mmap, NULL, swapper_pg_dir, \ + ATOMIC_INIT(1), 1, \ MUTEX, \ 0, \ 0, 0, 0, 0, \ @@ -197,6 +200,13 @@ struct signal_struct { { {{0,}}, }, \ SPIN_LOCK_UNLOCKED } +/* + * Some day this will be a full-fledged user tracking system.. + * Right now it is only used to track how many processes a + * user has, but it has the potential to track memory usage etc. + */ +struct user_struct; + struct task_struct { /* these are hardcoded - don't touch */ volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ @@ -207,14 +217,21 @@ struct task_struct { 0-0xFFFFFFFF for kernel-thread */ struct exec_domain *exec_domain; + long need_resched; /* various fields */ - long debugreg[8]; /* Hardware debugging registers */ long counter; long priority; - struct linux_binfmt *binfmt; +/* SMP and runqueue state */ + int has_cpu; + int processor; + int last_processor; + int lock_depth; /* Lock depth. We can context switch in and out of holding a syscall kernel lock... */ struct task_struct *next_task, *prev_task; struct task_struct *next_run, *prev_run; + +/* task state */ + struct linux_binfmt *binfmt; int exit_code, exit_signal; int pdeath_signal; /* The signal sent when the parent dies */ /* ??? */ @@ -262,6 +279,7 @@ struct task_struct { int ngroups; gid_t groups[NGROUPS]; kernel_cap_t cap_effective, cap_inheritable, cap_permitted; + struct user_struct *user; /* limits */ struct rlimit rlim[RLIM_NLIMITS]; unsigned short used_math; @@ -281,16 +299,12 @@ struct task_struct { /* memory management info */ struct mm_struct *mm; /* signal handlers */ + spinlock_t sigmask_lock; /* Protects signal and blocked */ struct signal_struct *sig; sigset_t signal, blocked; struct signal_queue *sigqueue, **sigqueue_tail; -/* SMP state */ - int has_cpu; - int processor; - int last_processor; - int lock_depth; /* Lock depth. We can context switch in and out of holding a syscall kernel lock... */ - /* Spinlocks for various pieces or per-task state. */ - spinlock_t sigmask_lock; /* Protects signal and blocked */ + unsigned long sas_ss_sp; + size_t sas_ss_size; }; /* @@ -306,10 +320,10 @@ struct task_struct { #define PF_SUPERPRIV 0x00000100 /* used super-user privileges */ #define PF_DUMPCORE 0x00000200 /* dumped core */ #define PF_SIGNALED 0x00000400 /* killed by a signal */ +#define PF_MEMALLOC 0x00000800 /* Allocating memory */ #define PF_USEDFPU 0x00100000 /* task used FPU this quantum (SMP) */ #define PF_DTRACE 0x00200000 /* delayed trace (used on m68k) */ -#define PF_ONSIGSTK 0x00400000 /* works on signal stack (m68k only) */ /* * Limit the stack by to some sane default: root can always @@ -319,26 +333,16 @@ struct task_struct { #define DEF_PRIORITY (20*HZ/100) /* 200 ms time slices */ -/* Note: This is very ugly I admit. But some versions of gcc will - * dump core when an empty structure constant is parsed at - * the end of a large top level structure initialization. -DaveM - */ -#ifdef __SMP__ -#define INIT_LOCKS SPIN_LOCK_UNLOCKED -#else -#define INIT_LOCKS -#endif - /* * INIT_TASK is used to set up the first task table, touch at * your own risk!. Base=0, limit=0x1fffff (=2MB) */ #define INIT_TASK \ -/* state etc */ { 0,0,0,KERNEL_DS,&default_exec_domain, \ -/* debugregs */ { 0, }, \ +/* state etc */ { 0,0,0,KERNEL_DS,&default_exec_domain,0, \ /* counter */ DEF_PRIORITY,DEF_PRIORITY, \ -/* binfmt */ NULL, \ +/* SMP */ 0,0,0,-1, \ /* schedlink */ &init_task,&init_task, &init_task, &init_task, \ +/* binfmt */ NULL, \ /* ec,brk... */ 0,0,0,0,0,0, \ /* pid etc.. */ 0,0,0,0,0, \ /* proc links*/ &init_task,&init_task,NULL,NULL,NULL, \ @@ -348,13 +352,14 @@ struct task_struct { /* timeout */ 0,SCHED_OTHER,0,0,0,0,0,0,0, \ /* timer */ { NULL, NULL, 0, 0, it_real_fn }, \ /* utime */ {0,0,0,0},0, \ -/* per cpu times */ {0, }, {0, }, \ +/* per CPU times */ {0, }, {0, }, \ /* flt */ 0,0,0,0,0,0, \ /* swp */ 0,0,0,0,0, \ /* process credentials */ \ /* uid etc */ 0,0,0,0,0,0,0,0, \ /* suppl grps*/ 0, {0,}, \ /* caps */ CAP_INIT_EFF_SET,CAP_INIT_INH_SET,CAP_FULL_SET, \ +/* user */ NULL, \ /* rlimits */ INIT_RLIMITS, \ /* math */ 0, \ /* comm */ "swapper", \ @@ -364,9 +369,7 @@ struct task_struct { /* fs */ &init_fs, \ /* files */ &init_files, \ /* mm */ &init_mm, \ -/* signals */ &init_signals, {{0}}, {{0}}, NULL, &init_task.sigqueue, \ -/* SMP */ 0,0,0,0, \ -/* locks */ INIT_LOCKS \ +/* signals */ SPIN_LOCK_UNLOCKED, &init_signals, {{0}}, {{0}}, NULL, &init_task.sigqueue, 0, 0, \ } union task_union { @@ -378,7 +381,6 @@ extern union task_union init_task_union; extern struct mm_struct init_mm; extern struct task_struct *task[NR_TASKS]; -extern struct task_struct *last_task_used_math; extern struct task_struct **tarray_freelist; extern spinlock_t taskslot_lock; @@ -437,7 +439,8 @@ extern __inline__ struct task_struct *find_task_by_pid(int pid) } /* per-UID process charging. */ -extern int charge_uid(struct task_struct *p, int count); +extern int alloc_uid(struct task_struct *p); +void free_uid(struct task_struct *p); #include <asm/current.h> @@ -445,7 +448,6 @@ extern unsigned long volatile jiffies; extern unsigned long itimer_ticks; extern unsigned long itimer_next; extern struct timeval xtime; -extern int need_resched; extern void do_timer(struct pt_regs *); extern unsigned int * prof_buffer; @@ -482,6 +484,7 @@ extern int kill_sl(pid_t, int, int); extern int kill_proc(pid_t, int, int); extern int do_sigaction(int sig, const struct k_sigaction *act, struct k_sigaction *oact); +extern int do_sigaltstack(const stack_t *ss, stack_t *oss, unsigned long sp); extern inline int signal_pending(struct task_struct *p) { @@ -519,6 +522,20 @@ static inline void recalc_sigpending(struct task_struct *t) t->sigpending = (ready != 0); } +/* True if we are on the alternate signal stack. */ + +static inline int on_sig_stack(unsigned long sp) +{ + return (sp >= current->sas_ss_sp + && sp < current->sas_ss_sp + current->sas_ss_size); +} + +static inline int sas_ss_flags(unsigned long sp) +{ + return (current->sas_ss_size == 0 ? SS_DISABLE + : on_sig_stack(sp) ? SS_ONSTACK : 0); +} + extern int request_irq(unsigned int irq, void (*handler)(int, void *, struct pt_regs *), unsigned long flags, @@ -566,7 +583,7 @@ extern inline int fsuser(void) extern inline int capable(int cap) { -#if 0 /* not yet */ +#if 1 /* ok now */ if (cap_raised(current->cap_effective, cap)) #else if (cap_is_fs_cap(cap) ? current->fsuid == 0 : current->euid == 0) @@ -584,7 +601,7 @@ extern inline int capable(int cap) extern struct mm_struct * mm_alloc(void); static inline void mmget(struct mm_struct * mm) { - mm->count++; + atomic_inc(&mm->count); } extern void mmput(struct mm_struct *); diff --git a/include/linux/sdla_x25.h b/include/linux/sdla_x25.h index 4c0f43725..58214a089 100644 --- a/include/linux/sdla_x25.h +++ b/include/linux/sdla_x25.h @@ -18,7 +18,7 @@ /*---------------------------------------------------------------------------- * Notes: * ------ - * 1. All structures defined in this file are byte-alined. To ensure + * 1. All structures defined in this file are byte-aligned. To ensure * portability of this code between different platforms and compilers, one * of the following defines must be defined before including this file: * @@ -104,7 +104,7 @@ typedef struct X25Cmd #define X25_READ 0x22 /* read X.25 packet */ #define X25_WRITE 0x23 /* send X.25 packet */ #define X25_PLACE_CALL 0x30 /* place a call on SVC */ -#define X25_ACCEPT_CALL 0x31 /* accept incomming call */ +#define X25_ACCEPT_CALL 0x31 /* accept incoming call */ #define X25_CLEAR_CALL 0x32 /* clear call */ #define X25_CLEAR_CONFRM 0x33 /* send clear confirmation packet */ #define X25_RESET 0x34 /* send reset request packet */ @@ -116,14 +116,14 @@ typedef struct X25Cmd #define X25_REGISTRATION_RQST 0x3A /* send registration request packet */ #define X25_REGISTRATION_CONFRM 0x3B /* send registration confirmation */ #define X25_IS_DATA_AVAILABLE 0x40 /* querry receive queue */ -#define X25_INCOMMING_CALL_CTL 0x41 /* select incomming call options */ +#define X25_INCOMING_CALL_CTL 0x41 /* select incoming call options */ #define X25_CONFIGURE_PVC 0x42 /* configure PVC */ #define X25_GET_ACTIVE_CHANNELS 0x43 /* get a list of active circuits */ #define X25_READ_CHANNEL_CONFIG 0x44 /* read virt. circuit configuration */ #define X25_FLUSH_DATA_BUFFERS 0x45 /* flush X.25-level data buffers */ #define X25_READ_HISTORY_TABLE 0x46 /* read asynchronous event log */ #define X25_HISTORY_TABLE_CTL 0x47 /* control asynchronous event log */ -#define X25_GET_TX_D_BIT_STATUS 0x48 /* is packet with D-bit acknowleged */ +#define X25_GET_TX_D_BIT_STATUS 0x48 /* is packet with D-bit acknowledged */ #define X25_READ_STATISTICS 0x49 /* read X.25-level statistics */ #define X25_FLUSH_STATISTICS 0x4A /* flush X.25-level statistics */ #define X25_READ_CONFIGURATION 0x50 /* read HDLC & X.25 configuration */ @@ -139,7 +139,7 @@ typedef struct X25Cmd #define X25RES_LINK_CLOSED 0x03 #define X25RES_INVAL_LENGTH 0x04 #define X25RES_INVAL_CMD 0x05 -#define X25RES_UNNUMBERED_FRAME 0x06 /* unnunbered frame received */ +#define X25RES_UNNUMBERED_FRAME 0x06 /* unnumbered frame received */ #define X25RES_FRM_REJECT_MODE 0x07 /* link is in Frame Reject mode */ #define X25RES_MODEM_FAILURE 0x08 /* DCD and/or CTS dropped */ #define X25RES_N2_RETRY_LIMIT 0x09 /* N2 retry limit has been exceeded */ @@ -153,10 +153,10 @@ typedef struct X25Cmd #define X25RES_INVAL_FORMAT 0x37 /* invalid packet format */ #define X25RES_D_BIT_NOT_SUPPRT 0x38 /* D-bit pragmatics not supported */ #define X25RES_FACIL_NOT_SUPPRT 0x39 /* Call facility not supported */ -#define X25RES_INVAL_CALL_ARG 0x3A /* errorneous call arguments */ -#define X25RES_INVAL_CALL_DATA 0x3B /* errorneous call user data */ +#define X25RES_INVAL_CALL_ARG 0x3A /* erroneous call arguments */ +#define X25RES_INVAL_CALL_DATA 0x3B /* erroneous call user data */ #define X25RES_ASYNC_PACKET 0x40 /* asynchronous packet received */ -#define X25RES_PROTO_VIOLATION 0x41 /* protocol violation occured */ +#define X25RES_PROTO_VIOLATION 0x41 /* protocol violation occurred */ #define X25RES_PKT_TIMEOUT 0x42 /* X.25 packet time out */ #define X25RES_PKT_RETRY_LIMIT 0x43 /* X.25 packet retry limit exceeded */ /*----- Command-dependent results -----*/ @@ -167,7 +167,7 @@ typedef struct X25Cmd #define X25RES_LINK_IS_OPEN 0x01 /* HDLC_LINK_OPEN */ #define X25RES_LINK_IS_DISC 0x02 /* HDLC_LINK_DISC */ #define X25RES_LINK_IS_CLOSED 0x03 /* HDLC_LINK_CLOSE */ -#define X25RES_INVAL_PARAM 0x31 /* INCOMMING_CALL_CTL */ +#define X25RES_INVAL_PARAM 0x31 /* INCOMING_CALL_CTL */ #define X25RES_INVAL_CONFIG 0x35 /* REGISTR_RQST/CONFRM */ /* @@ -239,7 +239,7 @@ typedef struct X25TimeStamp typedef struct X25Status { unsigned short pvc_map PACKED; /* 00h: PVC map */ - unsigned short icc_map PACKED; /* 02h: Incomming Chan. map */ + unsigned short icc_map PACKED; /* 02h: Incoming Chan. map */ unsigned short twc_map PACKED; /* 04h: Two-way Cnan. map */ unsigned short ogc_map PACKED; /* 06h: Outgoing Chan. map */ TX25TimeStamp tstamp PACKED; /* 08h: timestamp (BCD) */ @@ -256,7 +256,7 @@ typedef struct X25Status #define X25_RX_INTR 0x01 /* receive interrupt */ #define X25_TX_INTR 0x02 /* transmit interrupt */ #define X25_MODEM_INTR 0x04 /* modem status interrupt (CTS/DCD) */ -#define X25_EVENT_INTR 0x10 /* asyncronous event encountered */ +#define X25_EVENT_INTR 0x10 /* asynchronous event encountered */ #define X25_CMD_INTR 0x08 /* interface command complete */ /* @@ -390,8 +390,8 @@ typedef struct X25Config unsigned short pktMTU PACKED; /* 0Fh: */ unsigned short loPVC PACKED; /* 11h: */ unsigned short hiPVC PACKED; /* 13h: */ - unsigned short loIncommingSVC PACKED; /* 15h: */ - unsigned short hiIncommingSVC PACKED; /* 17h: */ + unsigned short loIncomingSVC PACKED; /* 15h: */ + unsigned short hiIncomingSVC PACKED; /* 17h: */ unsigned short loTwoWaySVC PACKED; /* 19h: */ unsigned short hiTwoWaySVC PACKED; /* 1Bh: */ unsigned short loOutgoingSVC PACKED; /* 1Dh: */ @@ -421,8 +421,8 @@ typedef struct X25ChanAlloc /*----- Channel allocation -*/ { unsigned short loPVC PACKED; /* 00h: lowest PVC number */ unsigned short hiPVC PACKED; /* 02h: highest PVC number */ - unsigned short loIncommingSVC PACKED; /* 04h: lowest incoming SVC */ - unsigned short hiIncommingSVC PACKED; /* 06h: highest incoming SVC */ + unsigned short loIncomingSVC PACKED; /* 04h: lowest incoming SVC */ + unsigned short hiIncomingSVC PACKED; /* 06h: highest incoming SVC */ unsigned short loTwoWaySVC PACKED; /* 08h: lowest two-way SVC */ unsigned short hiTwoWaySVC PACKED; /* 0Ah: highest two-way SVC */ unsigned short loOutgoingSVC PACKED; /* 0Ch: lowest outgoing SVC */ @@ -499,7 +499,7 @@ typedef struct X25EventLog /* * Defines for the 'type' field. */ -#define X25LOG_INCOMMING 0x00 +#define X25LOG_INCOMING 0x00 #define X25LOG_APPLICATION 0x01 #define X25LOG_AUTOMATIC 0x02 #define X25LOG_ERROR 0x04 @@ -568,7 +568,7 @@ typedef struct X25Trace /*----- Trace data structure -------*/ #define X25_TRCERR_RX_BADCRC 0x20 /* receive CRC error */ #define X25_TRCERR_RX_OVERRUN 0x30 /* receiver overrun error */ #define X25_TRCERR_RX_TOO_LONG 0x40 /* excessive frame length error */ -#define X25_TRCERR_TX_ABORT 0x70 /* aborted frame transmittion error */ +#define X25_TRCERR_TX_ABORT 0x70 /* aborted frame transmission error */ #define X25_TRCERR_TX_UNDERRUN 0x80 /* transmit underrun error */ /***************************************************************************** @@ -582,7 +582,7 @@ typedef struct HDLCFrame /*----- DHLC Frame Format ----------*/ unsigned char data[0] PACKED; } THDLCFrame; -typedef struct X25Pkt /*----- X.25 Paket Format ----------*/ +typedef struct X25Pkt /*----- X.25 Packet Format ----------*/ { unsigned char lcn_hi PACKED; /* 4 MSB of Logical Channel Number */ unsigned char lcn_lo PACKED; /* 8 LSB of Logical Channel Number */ diff --git a/include/linux/selection.h b/include/linux/selection.h index e41e9ebef..45a14a4b3 100644 --- a/include/linux/selection.h +++ b/include/linux/selection.h @@ -4,7 +4,10 @@ * Interface between console.c, tty_io.c, vt.c, vc_screen.c and selection.c */ -#include <linux/config.h> +#ifndef _LINUX_SELECTION_H_ +#define _LINUX_SELECTION_H_ + +#include <linux/vt_buffer.h> extern int sel_cons; @@ -15,275 +18,29 @@ extern int sel_loadlut(const unsigned long arg); extern int mouse_reporting(void); extern void mouse_report(struct tty_struct * tty, int butt, int mrx, int mry); -#ifdef CONFIG_FB_CONSOLE -extern unsigned long get_video_num_columns(unsigned int console); -extern unsigned long get_video_num_lines(unsigned int console); -extern unsigned long get_video_size_row(unsigned int console); -#else -#define get_video_num_columns(dummy) video_num_columns -#define get_video_num_lines(dummy) video_num_lines -#define get_video_size_row(dummy) video_size_row -#endif - -extern unsigned long video_num_columns; -extern unsigned long video_num_lines; -extern unsigned long video_size_row; -extern unsigned char video_type; -extern unsigned long video_mem_base; -extern unsigned long video_mem_term; -extern unsigned long video_screen_size; -extern unsigned short video_port_reg; -extern unsigned short video_port_val; +#define video_num_columns (vc_cons[currcons].d->vc_cols) +#define video_num_lines (vc_cons[currcons].d->vc_rows) +#define video_size_row (vc_cons[currcons].d->vc_size_row) +#define video_screen_size (vc_cons[currcons].d->vc_screenbuf_size) +#define can_do_color (vc_cons[currcons].d->vc_can_do_color) extern int console_blanked; -extern int can_do_color; - -extern unsigned long video_font_height; -extern unsigned long video_scan_lines; -extern unsigned long default_font_height; -extern int video_font_is_default; extern unsigned char color_table[]; extern int default_red[]; extern int default_grn[]; extern int default_blu[]; -extern unsigned short __real_origin; -extern unsigned short __origin; -extern unsigned char has_wrapped; - -extern unsigned short *vc_scrbuf[MAX_NR_CONSOLES]; - extern void do_unblank_screen(void); extern unsigned short *screen_pos(int currcons, int w_offset, int viewed); -extern unsigned short screen_word(int currcons, int offset, int viewed); -extern int scrw2glyph(unsigned short scr_word); +extern u16 screen_glyph(int currcons, int offset); extern void complement_pos(int currcons, int offset); extern void invert_screen(int currcons, int offset, int count, int shift); -#define reverse_video_char(a) (((a) & 0x88) | ((((a) >> 4) | ((a) << 4)) & 0x77)) -#define reverse_video_short(a) (((a) & 0x88ff) | \ - (((a) & 0x7000) >> 4) | (((a) & 0x0700) << 4)) -/* this latter line used to have masks 0xf000 and 0x0f00, but selection - requires a self-inverse operation; moreover, the old version looks wrong */ - extern void getconsxy(int currcons, char *p); extern void putconsxy(int currcons, char *p); +extern u16 vcs_scr_readw(int currcons, u16 *org); +extern void vcs_scr_writew(int currcons, u16 val, u16 *org); -/* how to access screen memory */ - -#if defined(CONFIG_TGA_CONSOLE) - -extern int tga_blitc(unsigned int, unsigned long); -extern unsigned long video_mem_term; - -/* - * TGA console screen memory access - * - * TGA is *not* a character/attribute cell device; font bitmaps must be rendered - * to the screen pixels. - * - * We must test for an Alpha kernel virtual address that falls within - * the "shadow screen" memory. This condition indicates we really want - * to write to the screen, so, we do... :-) - * - * NOTE also: there's only *TWO* operations: to put/get a character/attribute. - * All the others needed by VGA support go away, as Not Applicable for TGA. - */ -static inline void scr_writew(unsigned short val, unsigned short * addr) -{ - /* - * always deposit the char/attr, then see if it was to "screen" mem. - * if so, then render the char/attr onto the real screen. - */ - *addr = val; - if ((unsigned long)addr < video_mem_term && - (unsigned long)addr >= video_mem_base) { - tga_blitc(val, (unsigned long) addr); - } -} - -static inline unsigned short scr_readw(unsigned short * addr) -{ - return *addr; -} - -#elif defined (CONFIG_SGI) - -#include <linux/vt_kern.h> -#include <linux/kd.h> -extern void blitc(unsigned short, unsigned long); -extern void memsetw(void * s, unsigned short c, unsigned int count); -extern void memcpyw(unsigned short *to, unsigned short *from, unsigned int count); -extern unsigned long video_mem_term; - -static inline void scr_writew(unsigned short val, unsigned short * addr) -{ - /* always deposit the char/attr, then see if it was to "screen" mem. - * if so, then render the char/attr onto the real screen. - */ - if(*addr != val) { - *addr = val; - if ((unsigned long)addr < video_mem_term && - (unsigned long)addr >= video_mem_base && - vt_cons [fg_console]->vc_mode == KD_TEXT) - blitc(val, (unsigned long) addr); - } -} - -static inline unsigned short scr_readw(unsigned short * addr) -{ - return *addr; -} - -#elif defined (CONFIG_VIDEO_G364) /* The G364 cards: same as above. */ - -extern void g364_blitc(unsigned short, unsigned long); -extern void g364_blitc_colour(unsigned short, unsigned long); -extern unsigned long video_mem_term; - -/* - * G364 console screen memory access - * - * G364 is *not* a character/attribute cell device; font bitmaps must be - * rendered to the screen pixels. - * - * The "unsigned short * addr" is *ALWAYS* a kernel virtual address, either - * of the VC's backing store, or the "shadow screen" memory where the screen - * contents are kept, as the G364 frame buffer is *not* char/attr cells. - * - * We must test for a Mips kernel virtual address that falls within - * the "shadow screen" memory. This condition indicates we really want - * to write to the screen, so, we do... :-) - * - * NOTE also: there's only *TWO* operations: to put/get a character/attribute. - * All the others needed by VGA support go away, as Not Applicable for G364. - */ -static inline void scr_writew(unsigned short val, unsigned short * addr) -{ - /* - * always deposit the char/attr, then see if it was to "screen" mem. - * if so, then render the char/attr onto the real screen. - */ - *addr = val; - if ((unsigned long)addr < video_mem_term && - (unsigned long)addr >= video_mem_base) { - if ((val & 0xff00) == 0x0700) - g364_blitc(val, (unsigned long) addr); /* B&W faster */ - else - g364_blitc_colour(val, (unsigned long) addr); - } -} - -static inline unsigned short scr_readw(unsigned short * addr) -{ - return *addr; -} - -#elif defined(CONFIG_SUN_CONSOLE) - -#include "vt_kern.h" -#include <linux/kd.h> -extern int sun_blitc(unsigned int, unsigned long); -extern void memsetw(void * s, unsigned short c, unsigned int count); -extern void memcpyw(unsigned short *to, unsigned short *from, unsigned int count); -extern unsigned long video_mem_term; - -/* Basically the same as the TGA stuff. */ -static inline void scr_writew(unsigned short val, unsigned short * addr) -{ - /* - * always deposit the char/attr, then see if it was to "screen" mem. - * if so, then render the char/attr onto the real screen. - */ - if (*addr != val) { - *addr = val; - if ((unsigned long)addr < video_mem_term && - (unsigned long)addr >= video_mem_base && - vt_cons [fg_console]->vc_mode == KD_TEXT) - sun_blitc(val, (unsigned long) addr); - } -} - -static inline unsigned short scr_readw(unsigned short * addr) -{ - return *addr; -} - -#else - -/* - * normal VGA console access - * - */ - -#include <asm/io.h> - -/* - * NOTE: "(long) addr < 0" tests for an Alpha kernel virtual address; this - * indicates a VC's backing store; otherwise, it's a bus memory address, for - * the VGA's screen memory, so we do the Alpha "swizzle"... :-) - */ -static inline void scr_writeb(unsigned char val, unsigned char * addr) -{ - if ((long) addr < 0) - *addr = val; - else - writeb(val, (unsigned long) addr); -} - -static inline unsigned char scr_readb(unsigned char * addr) -{ - if ((long) addr < 0) - return *addr; - return readb((unsigned long) addr); -} - -static inline void scr_writew(unsigned short val, unsigned short * addr) -{ -#ifdef __powerpc__ - st_le16(addr, val); -#else - if ((long) addr < 0) - *addr = val; - else - writew(val, (unsigned long) addr); -#endif /* !__powerpc__ */ -} - -static inline unsigned short scr_readw(unsigned short * addr) -{ -#ifdef __powerpc__ - return ld_le16(addr); -#else - if ((long) addr < 0) - return *addr; - return readw((unsigned long) addr); -#endif /* !__powerpc__ */ -} - -#endif /* CONFIG_TGA_CONSOLE */ - -#if !defined(CONFIG_SUN_CONSOLE) && !defined(CONFIG_SGI) -static inline void memsetw(void * s, unsigned short c, unsigned int count) -{ - unsigned short * addr = (unsigned short *) s; - - count /= 2; - while (count) { - count--; - scr_writew(c, addr++); - } -} - -static inline void memcpyw(unsigned short *to, unsigned short *from, - unsigned int count) -{ - count /= 2; - while (count) { - count--; - scr_writew(scr_readw(from++), to++); - } -} -#endif /* !defined(CONFIG_SUN_CONSOLE) && !defined(CONFIG_SGI) */ +#endif diff --git a/include/linux/serial_reg.h b/include/linux/serial_reg.h index c982ae28b..713227a56 100644 --- a/include/linux/serial_reg.h +++ b/include/linux/serial_reg.h @@ -1,5 +1,5 @@ /* - * include/linux/serial.h + * include/linux/serial_reg.h * * Copyright (C) 1992, 1994 by Theodore Ts'o. * diff --git a/include/linux/signal.h b/include/linux/signal.h index ff193cd24..d6e82ae05 100644 --- a/include/linux/signal.h +++ b/include/linux/signal.h @@ -162,6 +162,8 @@ extern inline void sigfillset(sigset_t *set) } } +extern char * render_sigset_t(sigset_t *set, char *buffer); + /* Some extensions for manipulating the low 32 signals in particular. */ extern inline void sigaddsetmask(sigset_t *set, unsigned long mask) diff --git a/include/linux/simp.h b/include/linux/simp.h deleted file mode 100644 index bf838f815..000000000 --- a/include/linux/simp.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * include/linux/simp.h -- simple allocator for cached objects - * - * This is meant as a faster and simpler (not full-featured) replacement - * for SLAB, thus the name "simp" :-) - * - * (C) 1997 Thomas Schoebel-Theuer - */ - -#ifndef SIMP_H -#define SIMP_H - -/* used for constructors / destructors */ -typedef void (*structor)(void *); - -/* create an object cache */ -/* positive clearable_offset means the next two pointers at that offset - * can be internally used for freelist pointers when the object is - * deallocated / not in use; - * if there is no space inside the element that can be reused for - * this purpose, supply -1. Using positive offsets is essential for - * saving space with very small-sized objects. - * - * Note for big-sized objects in the range of whole pages, use - * the fast Linux page allocator instead, directly. - */ -extern struct simp * simp_create(char * name, long size, - structor first_ctor, - structor again_ctor, - structor dtor); - -/* alloc / dealloc routines */ -extern void * simp_alloc(struct simp * simp); -extern void simp_free(void * objp); - -/* garbage collection */ -extern long simp_garbage(void); - -#endif diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 9e9b338b6..ee6c79970 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -96,7 +96,9 @@ struct sk_buff { unsigned char *tail; /* Tail pointer */ unsigned char *end; /* End pointer */ void (*destructor)(struct sk_buff *); /* Destruct function */ - +#ifdef CONFIG_IP_FIREWALL + __u32 fwmark; /* Label made by fwchains, used by pktsched */ +#endif #if defined(CONFIG_SHAPER) || defined(CONFIG_SHAPER_MODULE) __u32 shapelatency; /* Latency on frame */ __u32 shapeclock; /* Time it should go out */ @@ -149,6 +151,8 @@ extern int skb_headroom(struct sk_buff *skb); extern int skb_tailroom(struct sk_buff *skb); extern void skb_reserve(struct sk_buff *skb, unsigned int len); extern void skb_trim(struct sk_buff *skb, unsigned int len); +extern void skb_over_panic(struct sk_buff *skb, int len, void *here); +extern void skb_under_panic(struct sk_buff *skb, int len, void *here); /* Internal */ extern __inline__ atomic_t *skb_datarefp(struct sk_buff *skb) @@ -435,10 +439,6 @@ extern __inline__ struct sk_buff *skb_dequeue_tail(struct sk_buff_head *list) return result; } - -extern const char skb_put_errstr[]; -extern const char skb_push_errstr[]; - /* * Add data to an sk_buff */ @@ -450,9 +450,9 @@ extern __inline__ unsigned char *skb_put(struct sk_buff *skb, unsigned int len) skb->len+=len; if(skb->tail>skb->end) { - __label__ here; - panic(skb_put_errstr,&&here,len); -here: ; + __label__ here; + skb_over_panic(skb, len, &&here); +here: ; } return tmp; } @@ -464,8 +464,8 @@ extern __inline__ unsigned char *skb_push(struct sk_buff *skb, unsigned int len) if(skb->data<skb->head) { __label__ here; - panic(skb_push_errstr, &&here,len); -here: ; + skb_under_panic(skb, len, &&here); +here: ; } return skb->data; } diff --git a/include/linux/smp.h b/include/linux/smp.h index ed3e0d31d..5034c71f6 100644 --- a/include/linux/smp.h +++ b/include/linux/smp.h @@ -7,12 +7,14 @@ */ #ifdef __SMP__ + #include <asm/smp.h> /* - * main IPI interface, handles INIT, TLB flush, STOP, etc.: + * main IPI interface, handles INIT, TLB flush, STOP, etc. (defined in asm header): + * + * extern void smp_message_pass(int target, int msg, unsigned long data, int wait); */ -extern void smp_message_pass(int target, int msg, unsigned long data, int wait); /* * Boot processor call to load the other CPU's @@ -62,6 +64,7 @@ extern volatile int smp_msg_id; #define smp_message_pass(t,m,d,w) #define smp_threads_ready 1 #define kernel_lock() +#define cpu_logical_map(cpu) 0 #endif #endif diff --git a/include/linux/smp_lock.h b/include/linux/smp_lock.h index f49013267..4583e2f5a 100644 --- a/include/linux/smp_lock.h +++ b/include/linux/smp_lock.h @@ -1,6 +1,17 @@ #ifndef __LINUX_SMPLOCK_H #define __LINUX_SMPLOCK_H -#include <asm/smp_lock.h> +#ifndef __SMP__ + +#define lock_kernel() do { } while(0) +#define unlock_kernel() do { } while(0) +#define release_kernel_lock(task, cpu) do { } while(0) +#define reacquire_kernel_lock(task) do { } while(0) + +#else + +#include <asm/smplock.h> + +#endif /* __SMP__ */ #endif diff --git a/include/linux/socket.h b/include/linux/socket.h index 8bc5acacd..e8f4202d5 100644 --- a/include/linux/socket.h +++ b/include/linux/socket.h @@ -1,6 +1,8 @@ #ifndef _LINUX_SOCKET_H #define _LINUX_SOCKET_H +#if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) + #include <asm/socket.h> /* arch-dependent defines */ #include <linux/sockios.h> /* the SIOCxxx I/O controls */ #include <linux/uio.h> /* iovec support */ @@ -114,9 +116,9 @@ __KINLINE struct cmsghdr * cmsg_nxthdr (struct msghdr *__msg, struct cmsghdr *__ #define SCM_CONNECT 0x03 /* rw: struct scm_connect */ struct ucred { - __kernel_pid_t pid; - __kernel_uid_t uid; - __kernel_gid_t gid; + __u32 pid; + __u32 uid; + __u32 gid; }; @@ -127,7 +129,7 @@ struct ucred { #define AF_INET 2 /* Internet IP Protocol */ #define AF_AX25 3 /* Amateur Radio AX.25 */ #define AF_IPX 4 /* Novell IPX */ -#define AF_APPLETALK 5 /* Appletalk DDP */ +#define AF_APPLETALK 5 /* AppleTalk DDP */ #define AF_NETROM 6 /* Amateur Radio NET/ROM */ #define AF_BRIDGE 7 /* Multiprotocol bridge */ #define AF_ATMPVC 8 /* ATM PVCs */ @@ -144,6 +146,7 @@ struct ucred { #define AF_ASH 18 /* Ash */ #define AF_ECONET 19 /* Acorn Econet */ #define AF_ATMSVC 20 /* ATM SVCs */ +#define AF_SNA 22 /* Linux SNA Project (nutters!) */ #define AF_MAX 32 /* For now.. */ /* Protocol families, same as address families. */ @@ -168,7 +171,9 @@ struct ucred { #define PF_ROUTE AF_ROUTE #define PF_PACKET AF_PACKET #define PF_ASH AF_ASH +#define PF_ECONET AF_ECONET #define PF_ATMSVC AF_ATMSVC +#define PF_SNA AF_SNA #define PF_MAX AF_MAX @@ -242,4 +247,5 @@ extern int move_addr_to_user(void *kaddr, int klen, void *uaddr, int *ulen); extern int move_addr_to_kernel(void *uaddr, int ulen, void *kaddr); extern int put_cmsg(struct msghdr*, int level, int type, int len, void *data); #endif +#endif /* not kernel and not glibc */ #endif /* _LINUX_SOCKET_H */ diff --git a/include/linux/sound.h b/include/linux/sound.h new file mode 100644 index 000000000..7dabc388c --- /dev/null +++ b/include/linux/sound.h @@ -0,0 +1,13 @@ +/* + * Sound core interface functions + */ + +extern int register_sound_special(struct file_operations *, int); +extern int register_sound_mixer(struct file_operations *fops); +extern int register_sound_midi(struct file_operations *fops); +extern int register_sound_dsp(struct file_operations *fops); + +extern void unregister_sound_special(int unit); +extern void unregister_sound_mixer(int unit); +extern void unregister_sound_midi(int unit); +extern void unregister_sound_dsp(int unit); diff --git a/include/linux/soundcard.h b/include/linux/soundcard.h index e48c0b079..deb73e6fd 100644 --- a/include/linux/soundcard.h +++ b/include/linux/soundcard.h @@ -69,7 +69,7 @@ #define SNDCARD_PSEUDO_MSS 24 #define SNDCARD_GUSPNP 25 #define SNDCARD_UART401 26 -/* Soundcard numbers 27 to N are reserved. Don't add more numbers here */ +/* Sound card numbers 27 to N are reserved. Don't add more numbers here. */ /*********************************** * IOCTL Commands for /dev/sequencer @@ -193,12 +193,16 @@ typedef struct seq_event_rec { * The following patch_info structure has been designed to support * Gravis UltraSound. It tries to be universal format for uploading * sample based patches but is probably too limited. + * + * (PBD) As Hannu guessed, the GUS structure is too limited for + * the WaveFront, but this is the right place for a constant definition. */ struct patch_info { unsigned short key; /* Use WAVE_PATCH here */ -#define WAVE_PATCH _PATCHKEY(0x04) -#define GUS_PATCH WAVE_PATCH +#define WAVE_PATCH _PATCHKEY(0x04) +#define GUS_PATCH WAVE_PATCH +#define WAVEFRONT_PATCH _PATCHKEY(0x06) short device_no; /* Synthesizer number */ short instr_no; /* Midi pgm# */ @@ -476,6 +480,7 @@ struct synth_info { /* Read only */ #define SAMPLE_TYPE_BASIC 0x10 #define SAMPLE_TYPE_GUS SAMPLE_TYPE_BASIC +#define SAMPLE_TYPE_WAVEFRONT 0x11 int perc_mode; /* No longer supported */ int nr_voices; @@ -606,7 +611,7 @@ typedef struct buffmem_desc { * * APF_NORMAL (the default) and APF_NETWORK make the driver to cleanup the * playback buffer whenever an underrun occurs. This consumes some time - * preven's looping the existing buffer. + * prevents looping the existing buffer. * APF_CPUINTENS is intended to be set by CPU intensive applications which * are likely to run out of time occasionally. In this mode the buffer cleanup is * disabled which saves CPU time but also let's the previous buffer content to diff --git a/include/linux/stat.h b/include/linux/stat.h index d86b1646f..e43e241f3 100644 --- a/include/linux/stat.h +++ b/include/linux/stat.h @@ -7,6 +7,8 @@ #endif +#if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) + #define S_IFMT 00170000 #define S_IFSOCK 0140000 #define S_IFLNK 0120000 @@ -42,6 +44,8 @@ #define S_IWOTH 00002 #define S_IXOTH 00001 +#endif + #ifdef __KERNEL__ #define S_IRWXUGO (S_IRWXU|S_IRWXG|S_IRWXO) #define S_IALLUGO (S_ISUID|S_ISGID|S_ISVTX|S_IRWXUGO) diff --git a/include/linux/sunrpc/clnt.h b/include/linux/sunrpc/clnt.h index da2b2cdd1..8553a05c5 100644 --- a/include/linux/sunrpc/clnt.h +++ b/include/linux/sunrpc/clnt.h @@ -127,6 +127,9 @@ rpc_set_timeout(struct rpc_clnt *clnt, unsigned int retr, unsigned long incr) xprt_set_timeout(&clnt->cl_timeout, retr, incr); } +extern void rpciod_tcp_dispatcher(void); +extern void rpciod_wake_up(void); + /* * Helper function for NFSroot support */ diff --git a/include/linux/sunrpc/sched.h b/include/linux/sunrpc/sched.h index 7012fb4a3..697950b2e 100644 --- a/include/linux/sunrpc/sched.h +++ b/include/linux/sunrpc/sched.h @@ -39,11 +39,11 @@ struct rpc_task { /* * RPC call state */ - u32 tk_proc; /* procedure number */ - u32 * tk_buffer; /* XDR buffer */ + __u32 tk_proc; /* procedure number */ + __u32 * tk_buffer; /* XDR buffer */ void * tk_argp; /* argument storage */ void * tk_resp; /* result storage */ - u8 tk_garb_retry, + __u8 tk_garb_retry, tk_cred_retry, tk_suid_retry; diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h index a470260b0..0037b5738 100644 --- a/include/linux/sunrpc/xprt.h +++ b/include/linux/sunrpc/xprt.h @@ -117,6 +117,9 @@ struct rpc_rqst { struct rpc_xprt { struct rpc_xprt * link; /* list of all clients */ + struct rpc_xprt * rx_pending; /* receive pending list */ + + int rx_pending_flag;/* are we on the pending list ? */ struct file * file; /* VFS layer */ struct socket * sock; /* BSD socket layer */ diff --git a/include/linux/swap.h b/include/linux/swap.h index 19e714c71..3b4d2c983 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h @@ -50,7 +50,7 @@ struct sysinfo; extern int shm_swap (int, int); /* linux/mm/vmscan.c */ -extern int try_to_free_page(int); +extern int try_to_free_pages(unsigned int gfp_mask, int count); /* linux/mm/page_io.c */ extern void rw_swap_page(int, unsigned long, char *, int); @@ -75,6 +75,11 @@ extern struct swap_info_struct swap_info[]; void si_swapinfo(struct sysinfo *); unsigned long get_swap_page(void); extern void FASTCALL(swap_free(unsigned long)); +struct swap_list_t { + int head; /* head of priority-ordered swapfile list */ + int next; /* swapfile to be used next */ +}; +extern struct swap_list_t swap_list; /* * vm_ops not present page codes for shared memory. @@ -124,21 +129,6 @@ static inline int is_page_shared(struct page *page) } /* - * When we're freeing pages from a user application, we want - * to cluster swapouts too. -- Rik. - * linux/mm/page_alloc.c - */ -static inline int try_to_free_pages(int gfp_mask, int count) -{ - int retval = 0; - while (count--) { - if (try_to_free_page(gfp_mask)) - retval = 1; - } - return retval; -} - -/* * Make these inline later once they are working properly. */ extern long find_in_swap_cache(struct page *page); diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h index 07f72a1a1..ef9044aa1 100644 --- a/include/linux/sysctl.h +++ b/include/linux/sysctl.h @@ -27,7 +27,7 @@ struct __sysctl_args { /* For internal pattern-matching use only: */ #ifdef __KERNEL__ -#define CTL_ANY -1 /* Matches any name */ +#define CTL_ANY -1 /* Matches any name */ #define CTL_NONE 0 #endif @@ -54,24 +54,20 @@ enum KERN_PROF, /* table: profiling information */ KERN_NODENAME, KERN_DOMAINNAME, - KERN_NRINODE, - KERN_MAXINODE, - KERN_NRFILE, - KERN_MAXFILE, KERN_SECURELVL, /* int: system security level */ KERN_PANIC, /* int: panic timeout */ KERN_REALROOTDEV, /* real root device to mount after initrd */ - KERN_NFSRNAME, /* NFS root name */ - KERN_NFSRADDRS, /* NFS root addresses */ KERN_JAVA_INTERPRETER, /* path to Java(tm) interpreter */ KERN_JAVA_APPLETVIEWER, /* path to Java(tm) appletviewer */ KERN_SPARC_REBOOT, /* reboot command on Sparc */ KERN_CTLALTDEL, /* int: allow ctl-alt-del to reboot */ KERN_PRINTK, /* sturct: control printk logging parameters */ KERN_NAMETRANS, /* Name translation */ - KERN_STATINODE, - KERN_DENTRY, /* dentry statistics */ + KERN_PPC_HTABRECLAIM, /* turn htab reclaimation on/off on PPC */ + KERN_PPC_ZEROPAGED, /* turn idle page zeroing on/off on PPC */ + KERN_PPC_POWERSAVE_NAP, /* use nap mode for power saving */ KERN_MODPROBE, + KERN_SG_BIG_BUFF }; @@ -85,7 +81,8 @@ enum VM_OVERCOMMIT_MEMORY, /* Turn off the virtual memory safety limit */ VM_BUFFERMEM, /* struct: Set buffer memory thresholds */ VM_PAGECACHE, /* struct: Set cache memory thresholds */ - VM_PAGERDAEMON /* struct: Control kswapd behaviour */ + VM_PAGERDAEMON, /* struct: Control kswapd behaviour */ + VM_PGT_CACHE /* struct: Set page table cache parameters */ }; @@ -360,6 +357,17 @@ enum { /* CTL_PROC names: */ /* CTL_FS names: */ +enum +{ + FS_NRINODE=1, /* int: current number of allocated inodes */ + FS_STATINODE, + FS_MAXINODE, /* int: maximum number of inodes that can be allocated */ + FS_NRDQUOT, /* int: current number of allocated dquots */ + FS_MAXDQUOT, /* int: maximum number of dquots that can be allocated */ + FS_NRFILE, /* int: current number of allocated filedescriptors */ + FS_MAXFILE, /* int: maximum number of filedescriptors that can be allocated */ + FS_DENTRY, +}; /* CTL_DEBUG names: */ diff --git a/include/linux/timer.h b/include/linux/timer.h index 2649014a1..64c461b2e 100644 --- a/include/linux/timer.h +++ b/include/linux/timer.h @@ -71,4 +71,22 @@ extern inline void init_timer(struct timer_list * timer) timer->prev = NULL; } +/* + * These inlines deal with timer wrapping correctly. You are + * strongly encouraged to use them + * 1. Because people otherwise forget + * 2. Because if the timer wrap changes in future you wont have to + * alter your driver code. + */ + +extern inline int time_before(unsigned long a, unsigned long b) +{ + return((long)((a) - (b)) < 0L); +} + +extern inline int time_after(unsigned long a, unsigned long b) +{ + return((long)((a) - (b)) > 0L); +} + #endif diff --git a/include/linux/timex.h b/include/linux/timex.h index c6e1527f6..df4743f58 100644 --- a/include/linux/timex.h +++ b/include/linux/timex.h @@ -17,6 +17,10 @@ /* * Modification history timex.h * + * 29 Dec 97 Russell King + * Moved CLOCK_TICK_RATE, CLOCK_TICK_FACTOR and FINETUNE to asm/timex.h + * for ARM machines + * * 9 Jan 97 Adrian Sun * Shifted LATCH define to allow access to alpha machines. * @@ -125,20 +129,13 @@ #define PPS_VALID 120 /* pps signal watchdog max (s) */ #define MAXGLITCH 30 /* pps signal glitch max (s) */ -/* LATCH is used in the interval timer and ftape setup. */ -#define CLOCK_TICK_RATE 1193180 /* Underlying HZ */ -#define LATCH ((CLOCK_TICK_RATE + HZ/2) / HZ) /* For divider */ - -#ifndef __alpha__ /* - * This definitively is wrong for the Alpha and none of the - * kernel code seems to reference this anymore. + * Pick up the architecture specific timex specifications */ -#define CLOCK_TICK_FACTOR 20 /* Factor of both 1000000 and CLOCK_TICK_RATE */ -#define FINETUNE ((((((long)LATCH * HZ - CLOCK_TICK_RATE) << SHIFT_HZ) * \ - (1000000/CLOCK_TICK_FACTOR) / (CLOCK_TICK_RATE/CLOCK_TICK_FACTOR)) \ - << (SHIFT_SCALE-SHIFT_HZ)) / HZ) -#endif /* !__alpha__ */ +#include <asm/timex.h> + +/* LATCH is used in the interval timer and ftape setup. */ +#define LATCH ((CLOCK_TICK_RATE + HZ/2) / HZ) /* For divider */ /* * syscall interface - used (mainly by NTP daemon) diff --git a/include/linux/trdevice.h b/include/linux/trdevice.h index e3a469fb5..8689db32d 100644 --- a/include/linux/trdevice.h +++ b/include/linux/trdevice.h @@ -33,7 +33,6 @@ extern int tr_header(struct sk_buff *skb, struct device *dev, void *saddr, unsigned len); extern int tr_rebuild_header(struct sk_buff *skb); extern unsigned short tr_type_trans(struct sk_buff *skb, struct device *dev); -extern void tr_reformat(struct sk_buff *, unsigned int); extern struct device * init_trdev(struct device *, int); #endif diff --git a/include/linux/tty.h b/include/linux/tty.h index 34c88d721..755d0441c 100644 --- a/include/linux/tty.h +++ b/include/linux/tty.h @@ -16,7 +16,9 @@ consoles 16 and higher (since it returns a short) */ #ifdef __KERNEL__ +#include <linux/config.h> #include <linux/fs.h> +#include <linux/major.h> #include <linux/termios.h> #include <linux/tqueue.h> #include <linux/tty_driver.h> @@ -32,26 +34,60 @@ * (Note: the *_driver.minor_start values 1, 64, 128, 192 are * hardcoded at present.) */ -#define NR_PTYS 256 +#define NR_PTYS 256 /* ptys/major */ #define NR_LDISCS 16 /* + * Unix98 PTY's can be defined as any multiple of NR_PTYS up to + * UNIX98_PTY_MAJOR_COUNT; this section defines what we need from the + * config options + */ +#ifdef CONFIG_UNIX98_PTYS +# define UNIX98_NR_MAJORS ((CONFIG_UNIX98_PTY_COUNT+NR_PTYS-1)/NR_PTYS) +# if UNIX98_NR_MAJORS <= 0 +# undef CONFIG_UNIX98_PTYS +# elif UNIX98_NR_MAJORS > UNIX98_PTY_MAJOR_COUNT +# error Too many Unix98 ptys defined +# undef UNIX98_NR_MAJORS +# define UNIX98_NR_MAJORS UNIX98_PTY_MAJOR_COUNT +# endif +#endif + +/* * These are set up by the setup-routine at boot-time: */ struct screen_info { - unsigned char orig_x; - unsigned char orig_y; - unsigned char unused1[2]; - unsigned short orig_video_page; - unsigned char orig_video_mode; - unsigned char orig_video_cols; - unsigned short unused2; - unsigned short orig_video_ega_bx; - unsigned short unused3; - unsigned char orig_video_lines; - unsigned char orig_video_isVGA; - unsigned short orig_video_points; + unsigned char orig_x; /* 0x00 */ + unsigned char orig_y; /* 0x01 */ + unsigned short dontuse1; /* 0x02 -- EXT_MEM_K sits here */ + unsigned short orig_video_page; /* 0x04 */ + unsigned char orig_video_mode; /* 0x06 */ + unsigned char orig_video_cols; /* 0x07 */ + unsigned short unused2; /* 0x08 */ + unsigned short orig_video_ega_bx; /* 0x0a */ + unsigned short unused3; /* 0x0c */ + unsigned char orig_video_lines; /* 0x0e */ + unsigned char orig_video_isVGA; /* 0x0f */ + unsigned short orig_video_points; /* 0x10 */ + + /* VESA graphic mode -- linear frame buffer */ + unsigned short lfb_width; /* 0x12 */ + unsigned short lfb_height; /* 0x14 */ + unsigned short lfb_depth; /* 0x16 */ + unsigned long lfb_base; /* 0x18 */ + unsigned long lfb_size; /* 0x1c */ + unsigned short dontuse2, dontuse3; /* 0x20 -- CL_MAGIC and CL_OFFSET here */ + unsigned short lfb_linelength; /* 0x24 */ + unsigned char red_size; /* 0x26 */ + unsigned char red_pos; /* 0x27 */ + unsigned char green_size; /* 0x28 */ + unsigned char green_pos; /* 0x29 */ + unsigned char blue_size; /* 0x2a */ + unsigned char blue_pos; /* 0x2b */ + unsigned char rsvd_size; /* 0x2c */ + unsigned char rsvd_pos; /* 0x2d */ + /* 0x2e -- 0x3f reserved for future expansion */ }; extern struct screen_info screen_info; @@ -70,10 +106,10 @@ extern struct screen_info screen_info; #define VIDEO_TYPE_EGAM 0x20 /* EGA/VGA in Monochrome Mode */ #define VIDEO_TYPE_EGAC 0x21 /* EGA in Color Mode */ #define VIDEO_TYPE_VGAC 0x22 /* VGA+ in Color Mode */ -#define VIDEO_TYPE_EGAC 0x21 /* EGA/VGA in Color Mode */ +#define VIDEO_TYPE_VLFB 0x23 /* VESA VGA in graphic mode */ #define VIDEO_TYPE_PICA_S3 0x30 /* ACER PICA-61 local S3 video */ #define VIDEO_TYPE_MIPS_G364 0x31 /* MIPS Magnum 4000 G364 video */ -#define VIDEO_TYPE_SNI_RM 0x31 /* SNI RM200 PCI video */ +#define VIDEO_TYPE_SNI_RM 0x32 /* SNI RM200 PCI video */ #define VIDEO_TYPE_TGAC 0x40 /* DEC TGA */ diff --git a/include/linux/tty_driver.h b/include/linux/tty_driver.h index ee6a7eb22..46ace283a 100644 --- a/include/linux/tty_driver.h +++ b/include/linux/tty_driver.h @@ -139,6 +139,7 @@ struct tty_driver { struct tty_struct **table; struct termios **termios; struct termios **termios_locked; + void *driver_state; /* only used for the PTY driver */ /* * Interface routines from the upper tty layer to the tty diff --git a/include/linux/ufs_fs.h b/include/linux/ufs_fs.h index b59cd5f90..70740489c 100644 --- a/include/linux/ufs_fs.h +++ b/include/linux/ufs_fs.h @@ -21,10 +21,6 @@ #ifndef __LINUX_UFS_FS_H #define __LINUX_UFS_FS_H -#undef UFS_HEAVY_DEBUG -/*#define UFS_HEAVY_DEBUG 1*/ -/* Uncomment the line above when hacking ufs code */ - #include <linux/types.h> #include <linux/kernel.h> #include <linux/time.h> @@ -35,11 +31,15 @@ #define UFS_SBLOCK 8192 #define UFS_SBSIZE 8192 +#define SECTOR_SIZE 512 +#define SECTOR_BITS 9 #define UFS_MAGIC 0x00011954 #define UFS_CIGAM 0x54190100 /* byteswapped MAGIC */ -#define UFS_FSIZE 1024 -#define UFS_BSIZE 8192 +#define UFS_BSIZE 8192 +#define UFS_MINBSIZE 4096 +#define UFS_FSIZE 1024 +#define UFS_MAXFRAG (UFS_BSIZE / UFS_FSIZE) #define UFS_NDADDR 12 #define UFS_NINDIR 3 @@ -48,7 +48,13 @@ #define UFS_DIND_BLOCK (UFS_NDADDR + 1) #define UFS_TIND_BLOCK (UFS_NDADDR + 2) +#define UFS_NDIR_FRAGMENT (UFS_NDADDR << uspi->s_fpbshift) +#define UFS_IND_FRAGMENT (UFS_IND_BLOCK << uspi->s_fpbshift) +#define UFS_DIND_FRAGMENT (UFS_DIND_BLOCK << uspi->s_fpbshift) +#define UFS_TIND_FRAGMENT (UFS_TIND_BLOCK << uspi->s_fpbshift) + #define UFS_ROOTINO 2 +#define UFS_FIRST_INO (UFS_ROOTINO + 1) #define UFS_USEEFT ((__u16)65535) @@ -87,62 +93,109 @@ #define UFS_HURD 0x00000130 #define UFS_SUN 0x00000200 #define UFS_NEXT 0x00000400 -/* we preserve distinction in flavor identification even without difference, - * because yet-to-be-supported features may introduce difference in the future - */ -/* last but not least, debug flags */ -#define UFS_DEBUG 0x01000000 -#define UFS_DEBUG_INODE 0x02000000 -#define UFS_DEBUG_NAMEI 0x04000000 -#define UFS_DEBUG_LINKS 0x08000000 - -#ifdef UFS_HEAVY_DEBUG -# define UFS_DEBUG_INITIAL UFS_DEBUG -#else -# define UFS_DEBUG_INITIAL 0 -#endif /* fs_inodefmt options */ #define UFS_42INODEFMT -1 #define UFS_44INODEFMT 2 -#define UFS_ADDR_PER_BLOCK(sb) ((sb)->u.ufs_sb.s_bsize >> 2) -#define UFS_ADDR_PER_BLOCK_BITS(sb) ((sb)->u.ufs_sb.s_bshift - 2) +/* + * MINFREE gives the minimum acceptable percentage of file system + * blocks which may be free. If the freelist drops below this level + * only the superuser may continue to allocate blocks. This may + * be set to 0 if no reserve of free blocks is deemed necessary, + * however throughput drops by fifty percent if the file system + * is run at between 95% and 100% full; thus the minimum default + * value of fs_minfree is 5%. However, to get good clustering + * performance, 10% is a better choice. hence we use 10% as our + * default value. With 10% free space, fragmentation is not a + * problem, so we choose to optimize for time. + */ +#define UFS_MINFREE 5 +#define UFS_DEFAULTOPT UFS_OPTTIME + +/* + * Turn file system block numbers into disk block addresses. + * This maps file system blocks to device size blocks. + */ +#define ufs_fsbtodb(uspi, b) ((b) << (uspi)->s_fsbtodb) +#define ufs_dbtofsb(uspi, b) ((b) >> (uspi)->s_fsbtodb) -/* Test if the inode number is valid. */ -#define ufs_ino_ok(inode) ((inode->i_ino < 2) && \ - (inode->i_ino > (inode->i_sb->u.ufs_sb.s_ncg * inode->i_sb->u.ufs_sb.s_ipg - 1))) +/* + * Cylinder group macros to locate things in cylinder groups. + * They calc file system addresses of cylinder group data structures. + */ +#define ufs_cgbase(c) (uspi->s_fpg * (c)) +#define ufs_cgstart(c) (ufs_cgbase(c) + uspi->s_cgoffset * ((c) & ~uspi->s_cgmask)) +#define ufs_cgsblock(c) (ufs_cgstart(c) + uspi->s_sblkno) /* super blk */ +#define ufs_cgcmin(c) (ufs_cgstart(c) + uspi->s_cblkno) /* cg block */ +#define ufs_cgimin(c) (ufs_cgstart(c) + uspi->s_iblkno) /* inode blk */ +#define ufs_cgdmin(c) (ufs_cgstart(c) + uspi->s_dblkno) /* 1st data */ -/* Convert (sb,cg) to the first physical block number for that cg. */ -#define ufs_cgstart(sb, cg) \ - (((sb)->u.ufs_sb.s_fpg * (cg)) + (sb)->u.ufs_sb.s_cgoffset * ((cg) & ~((sb)->u.ufs_sb.s_cgmask))) +/* + * Macros for handling inode numbers: + * inode number to file system block offset. + * inode number to cylinder group number. + * inode number to file system block address. + */ +#define ufs_inotocg(x) ((x) / uspi->s_ipg) +#define ufs_inotocgoff(x) ((x) % uspi->s_ipg) +#define ufs_inotofsba(x) (ufs_cgimin(ufs_inotocg(x)) + ufs_inotocgoff(x) / uspi->s_inopf) +#define ufs_inotofsbo(x) ((x) % uspi->s_inopf) -/* Convert (sb,cg) to the first phys. block number for inodes in that cg. */ -#define ufs_cgimin(sb, cg) (ufs_cgstart((sb), (cg)) + (sb)->u.ufs_sb.s_iblkno) -#define ufs_cgdmin(sb, cg) (ufs_cgstart((sb), (cg)) + (sb)->u.ufs_sb.s_dblkno) +/* + * Give cylinder group number for a file system block. + * Give cylinder group block number for a file system block. + */ +#define ufs_dtog(d) ((d) / uspi->s_fpg) +#define ufs_dtogd(d) ((d) % uspi->s_fpg) -/* Convert an inode number to a cg number. */ -/* XXX - this can be optimized if s_ipg is a power of 2. */ -#define ufs_ino2cg(inode) ((inode)->i_ino/(inode)->i_sb->u.ufs_sb.s_ipg) +/* + * Compute the cylinder and rotational position of a cyl block addr. + */ +#define ufs_cbtocylno(bno) \ + ((bno) * uspi->s_nspf / uspi->s_spc) +#define ufs_cbtorpos(bno) \ + ((((bno) * uspi->s_nspf % uspi->s_spc / uspi->s_nsect \ + * uspi->s_trackskew + (bno) * uspi->s_nspf % uspi->s_spc \ + % uspi->s_nsect * uspi->s_interleave) % uspi->s_nsect \ + * uspi->s_nrpos) / uspi->s_npsect) -/* current filesystem state; method depends on flags */ -#define UFS_STATE(usb) \ - ( ((flags&UFS_ST_MASK) == UFS_ST_OLD) \ - ? (usb)->fs_u.fs_sun.fs_state /* old normal way */ \ - : (usb)->fs_u.fs_44.fs_state /* 4.4BSD way */ ) +/* + * The following macros optimize certain frequently calculated + * quantities by using shifts and masks in place of divisions + * modulos and multiplications. + */ +#define ufs_blkoff(loc) ((loc) & uspi->s_qbmask) +#define ufs_fragoff(loc) ((loc) & uspi->s_qfmask) +#define ufs_lblktosize(blk) ((blk) << uspi->s_bshift) +#define ufs_lblkno(loc) ((loc) >> uspi->s_bshift) +#define ufs_numfrags(loc) ((loc) >> uspi->s_fshift) +#define ufs_blkroundup(size) (((size) + uspi->s_qbmask) & uspi->s_bmask) +#define ufs_fragroundup(size) (((size) + uspi->s_qfmask) & uspi->s_fmask) +#define ufs_fragstoblks(frags) ((frags) >> uspi->s_fpbshift) +#define ufs_blkstofrags(blks) ((blks) << uspi->s_fpbshift) +#define ufs_fragnum(fsb) ((fsb) & uspi->s_fpbmask) +#define ufs_blknum(fsb) ((fsb) & ~uspi->s_fpbmask) #define UFS_MAXNAMLEN 255 +#define UFS_MAXMNTLEN 512 +#define UFS_MAXCSBUFS 31 +#define UFS_LINK_MAX EXT2_LINK_MAX -#define ufs_lbn(sb, block) ((block) >> (sb)->u.ufs_sb.s_lshift) -#define ufs_boff(sb, block) ((block) & ~((sb)->u.ufs_sb.s_lmask)) -#define ufs_dbn(sb, block, boff) ((block) + ufs_boff((sb), (boff))) +/* + * UFS_DIR_PAD defines the directory entries boundaries + * (must be a multiple of 4) + */ +#define UFS_DIR_PAD 4 +#define UFS_DIR_ROUND (UFS_DIR_PAD - 1) +#define UFS_DIR_REC_LEN(name_len) (((name_len) + 1 + 8 + UFS_DIR_ROUND) & ~UFS_DIR_ROUND) struct ufs_timeval { __s32 tv_sec; __s32 tv_usec; }; -struct ufs_direct { +struct ufs_dir_entry { __u32 d_ino; /* inode number of this entry */ __u16 d_reclen; /* length of this entry */ union { @@ -155,9 +208,6 @@ struct ufs_direct { __u8 d_name[UFS_MAXNAMLEN + 1]; /* file name */ }; -#define MAXMNTLEN 512 -#define MAXCSBUFS 32 - struct ufs_csum { __u32 cs_ndir; /* number of directories */ __u32 cs_nbfree; /* number of free blocks */ @@ -168,7 +218,7 @@ struct ufs_csum { /* * This is the actual superblock, as it is laid out on the disk. */ -struct ufs_superblock { +struct ufs_super_block { __u32 fs_link; /* UNUSED */ __u32 fs_rlink; /* UNUSED */ __u32 fs_sblkno; /* addr of super-block in filesys */ @@ -237,15 +287,18 @@ struct ufs_superblock { __u8 fs_clean; /* file system is clean flag */ __u8 fs_ronly; /* mounted read-only flag */ __u8 fs_flags; /* currently unused flag */ - __u8 fs_fsmnt[MAXMNTLEN]; /* name mounted on */ + __u8 fs_fsmnt[UFS_MAXMNTLEN]; /* name mounted on */ /* these fields retain the current block allocation info */ __u32 fs_cgrotor; /* last cg searched */ - __u32 fs_csp[MAXCSBUFS]; /* list of fs_cs info buffers */ + __u32 fs_csp[UFS_MAXCSBUFS]; /* list of fs_cs info buffers */ + __u32 fs_maxcluster; __u32 fs_cpc; /* cyl per cycle in postbl */ __u16 fs_opostbl[16][8]; /* old rotation block list head */ union { struct { - __s32 fs_sparecon[55];/* reserved for future constants */ + __s32 fs_sparecon[53];/* reserved for future constants */ + __s32 fs_reclaim; + __s32 fs_sparecon2[1]; __s32 fs_state; /* file system state time stamp */ __u32 fs_qbmask[2]; /* ~usb_bmask */ __u32 fs_qfmask[2]; /* ~usb_fmask */ @@ -255,7 +308,7 @@ struct ufs_superblock { __s32 fs_contigsumsize;/* size of cluster summary array */ __s32 fs_maxsymlinklen;/* max length of an internal symlink */ __s32 fs_inodefmt; /* format of on-disk inodes */ - __u32 fs_maxfilesize[2];/* max representable file size */ + __u32 fs_maxfilesize[2]; /* max representable file size */ __u32 fs_qbmask[2]; /* ~usb_bmask */ __u32 fs_qfmask[2]; /* ~usb_fmask */ __s32 fs_state; /* file system state time stamp */ @@ -270,6 +323,59 @@ struct ufs_superblock { }; /* + * Preference for optimization. + */ +#define UFS_OPTTIME 0 /* minimize allocation time */ +#define UFS_OPTSPACE 1 /* minimize disk fragmentation */ + +/* + * Rotational layout table format types + */ +#define UFS_42POSTBLFMT -1 /* 4.2BSD rotational table format */ +#define UFS_DYNAMICPOSTBLFMT 1 /* dynamic rotational table format */ + +/* + * Convert cylinder group to base address of its global summary info. + */ +#define fs_cs(indx) \ + u.ufs_sb.s_csp[(indx) >> uspi->s_csshift][(indx) & ~uspi->s_csmask] + +/* + * Cylinder group block for a file system. + * + * Writable fields in the cylinder group are protected by the associated + * super block lock fs->fs_lock. + */ +#define CG_MAGIC 0x090255 +#define ufs_cg_chkmagic(ucg) (SWAB32((ucg)->cg_magic) == CG_MAGIC) + +/* + * size of this structure is 172 B + */ +struct ufs_cylinder_group { + __u32 cg_link; /* linked list of cyl groups */ + __u32 cg_magic; /* magic number */ + __u32 cg_time; /* time last written */ + __u32 cg_cgx; /* we are the cgx'th cylinder group */ + __u16 cg_ncyl; /* number of cyl's this cg */ + __u16 cg_niblk; /* number of inode blocks this cg */ + __u32 cg_ndblk; /* number of data blocks this cg */ + struct ufs_csum cg_cs; /* cylinder summary information */ + __u32 cg_rotor; /* position of last used block */ + __u32 cg_frotor; /* position of last used frag */ + __u32 cg_irotor; /* position of last used inode */ + __u32 cg_frsum[UFS_MAXFRAG]; /* counts of available frags */ + __u32 cg_btotoff; /* (__u32) block totals per cylinder */ + __u32 cg_boff; /* (short) free block positions */ + __u32 cg_iusedoff; /* (char) used inode map */ + __u32 cg_freeoff; /* (u_char) free block map */ + __u32 cg_nextfreeoff; /* (u_char) next available space */ + __u32 cg_sparecon[16]; /* reserved for future use */ + __u8 cg_space[1]; /* space for cylinder group maps */ +/* actually longer */ +}; + +/* * structure of an on-disk inode */ struct ufs_inode { @@ -277,11 +383,11 @@ struct ufs_inode { __u16 ui_nlink; /* 0x2 */ union { struct { - __u16 suid; /* 0x4 */ - __u16 sgid; /* 0x6 */ + __u16 ui_suid; /* 0x4 */ + __u16 ui_sgid; /* 0x6 */ } oldids; - __u32 inumber; /* 0x4 lsf: inode number */ - __u32 author; /* 0x4 GNU HURD: author */ + __u32 ui_inumber; /* 0x4 lsf: inode number */ + __u32 ui_author; /* 0x4 GNU HURD: author */ } ui_u1; __u64 ui_size; /* 0x8 */ struct ufs_timeval ui_atime; /* 0x10 access */ @@ -333,43 +439,73 @@ struct ufs_inode { #define UFS_SF_IMMUTABLE 0x00020000 /* immutable (can't "change") */ #define UFS_SF_APPEND 0x00040000 /* append-only */ #define UFS_SF_NOUNLINK 0x00100000 /* can't be removed or renamed */ - - -#ifdef __KERNEL__ -/* - * Function prototypes - */ - -/* ufs_inode.c */ -extern int ufs_bmap (struct inode *, int); -extern void ufs_read_inode(struct inode * inode); -extern void ufs_put_inode(struct inode * inode); -extern void ufs_print_inode (struct inode *); +#ifdef __KERNEL__ -/* ufs_namei.c */ -extern int ufs_lookup (struct inode *, struct dentry *); +/* acl.c */ +extern int ufs_permission (struct inode *, int); -/* ufs_super.c */ -extern void ufs_warning (struct super_block *, const char *, const char *, ...) - __attribute__ ((format (printf, 3, 4))); -extern int init_ufs_fs(void); +/* balloc.c */ +extern void ufs_free_fragments (struct inode *, unsigned, unsigned); +extern void ufs_free_blocks (struct inode *, unsigned, unsigned); +extern unsigned ufs_new_fragments (struct inode *, u32 *, unsigned, unsigned, unsigned, int *); -/* - * Inodes and files operations - */ +/* cylinder.c */ +extern struct ufs_cg_private_info * ufs_load_cylinder (struct super_block *, unsigned); +extern void ufs_put_cylinder (struct super_block *, unsigned); -/* ufs_dir.c */ +/* dir.c */ extern struct inode_operations ufs_dir_inode_operations; extern struct file_operations ufs_dir_operations; +extern int ufs_check_dir_entry (const char *, struct inode *, struct ufs_dir_entry *, struct buffer_head *, unsigned long); -/* ufs_file.c */ +/* file.c */ extern struct inode_operations ufs_file_inode_operations; extern struct file_operations ufs_file_operations; -/* ufs_symlink.c */ +/* ialloc.c */ +extern void ufs_free_inode (struct inode *inode); +extern struct inode * ufs_new_inode (const struct inode *, int, int *); + +/* inode.c */ +extern int ufs_bmap (struct inode *, int); +extern void ufs_read_inode (struct inode *); +extern void ufs_put_inode (struct inode *); +extern void ufs_write_inode (struct inode *); +extern int ufs_sync_inode (struct inode *); +extern void ufs_print_inode (struct inode *); +extern void ufs_write_inode (struct inode *); +extern void ufs_delete_inode (struct inode *); +extern struct buffer_head * ufs_getfrag (struct inode *, unsigned, int, int *); +extern struct buffer_head * ufs_bread (struct inode *, unsigned, int, int *); + +/* namei.c */ +extern int ufs_lookup (struct inode *, struct dentry *); +extern int ufs_mkdir(struct inode *, struct dentry *, int); +extern int ufs_rmdir (struct inode *, struct dentry *); +extern int ufs_unlink (struct inode *, struct dentry *); +extern int ufs_create (struct inode *, struct dentry *, int); +extern int ufs_rename (struct inode *, struct dentry *, struct inode *, struct dentry *); +extern int ufs_mknod (struct inode *, struct dentry *, int, int); +extern int ufs_symlink (struct inode *, struct dentry *, const char *); +extern int ufs_link (struct dentry *, struct inode *, struct dentry *); + +/* super.c */ +extern struct super_operations ufs_super_ops; +extern struct file_system_type ufs_fs_type; +extern void ufs_warning (struct super_block *, const char *, const char *, ...) __attribute__ ((format (printf, 3, 4))); +extern void ufs_error (struct super_block *, const char *, const char *, ...) __attribute__ ((format (printf, 3, 4))); +extern void ufs_panic (struct super_block *, const char *, const char *, ...) __attribute__ ((format (printf, 3, 4))); + +extern int init_ufs_fs(void); +extern void ufs_write_super (struct super_block *); +extern void ufs_print_cylinder_stuff(struct ufs_cylinder_group *, __u32); + +/* symlink.c */ extern struct inode_operations ufs_symlink_inode_operations; -extern struct file_operations ufs_symlink_operations; + +/* truncate.c */ +extern void ufs_truncate (struct inode *); #endif /* __KERNEL__ */ diff --git a/include/linux/ufs_fs_i.h b/include/linux/ufs_fs_i.h index 31611830b..e270b71aa 100644 --- a/include/linux/ufs_fs_i.h +++ b/include/linux/ufs_fs_i.h @@ -8,6 +8,8 @@ * * NeXTstep support added on February 5th 1998 by * Niels Kristian Bech Jensen <nkbj@image.dk>. + * + * write support by Daniel Pirkl <daniel.pirkl@email.cz> */ #ifndef _LINUX_UFS_FS_I_H @@ -16,7 +18,7 @@ struct ufs_inode_info { union { __u32 i_data[15]; - __u8 i_symlink[4*15]; /* fast symlink */ + __u8 i_symlink[4*15]; } i_u1; __u64 i_size; __u32 i_flags; @@ -25,6 +27,8 @@ struct ufs_inode_info { __u32 i_uid; __u32 i_gid; __u32 i_oeftflag; + __u16 i_osync; + __u32 i_lastfrag; }; #endif /* _LINUX_UFS_FS_I_H */ diff --git a/include/linux/ufs_fs_sb.h b/include/linux/ufs_fs_sb.h index 1469f659f..3f89d4079 100644 --- a/include/linux/ufs_fs_sb.h +++ b/include/linux/ufs_fs_sb.h @@ -1,4 +1,4 @@ -/* +/* * linux/include/linux/ufs_fs_sb.h * * Copyright (C) 1996 @@ -6,8 +6,10 @@ * Laboratory for Computer Science Research Computing Facility * Rutgers, The State University of New Jersey * - * NeXTstep support added on February 5th 1998 by - * Niels Kristian Bech Jensen <nkbj@image.dk>. + * $Id: ufs_fs_sb.h,v 1.8 1998/05/06 12:04:40 jj Exp $ + * + * Write support by Daniel Pirkl (daniel.pirkl@email.cz) + * Charles University (Prague), Faculty of Mathematics and Physics */ #ifndef __LINUX_UFS_FS_SB_H @@ -15,27 +17,210 @@ #include <linux/ufs_fs.h> +/* + * This structure is used for reading disk structures larger + * than the size of fragment. + */ +struct ufs_buffer_head { + unsigned fragment; /* first fragment */ + unsigned count; /* number of fragments */ + struct buffer_head * bh[UFS_MAXFRAG]; /* buffers */ +}; + +struct ufs_cg_private_info { + struct ufs_cylinder_group ucg; + __u32 c_cgx; /* number of cylidner group */ + __u16 c_ncyl; /* number of cyl's this cg */ + __u16 c_niblk; /* number of inode blocks this cg */ + __u32 c_ndblk; /* number of data blocks this cg */ + __u32 c_rotor; /* position of last used block */ + __u32 c_frotor; /* position of last used frag */ + __u32 c_irotor; /* position of last used inode */ + __u32 c_btotoff; /* (__u32) block totals per cylinder */ + __u32 c_boff; /* (short) free block positions */ + __u32 c_iusedoff; /* (char) used inode map */ + __u32 c_freeoff; /* (u_char) free block map */ + __u32 c_nextfreeoff; /* (u_char) next available space */ +}; + + +struct ufs_sb_private_info { + struct ufs_buffer_head s_ubh; /* buffer containing super block */ + __u32 s_sblkno; /* offset of super-blocks in filesys */ + __u32 s_cblkno; /* offset of cg-block in filesys */ + __u32 s_iblkno; /* offset of inode-blocks in filesys */ + __u32 s_dblkno; /* offset of first data after cg */ + __u32 s_cgoffset; /* cylinder group offset in cylinder */ + __u32 s_cgmask; /* used to calc mod fs_ntrak */ + __u32 s_size; /* number of blocks (fragments) in fs */ + __u32 s_dsize; /* number of data blocks in fs */ + __u32 s_ncg; /* number of cylinder groups */ + __u32 s_bsize; /* size of basic blocks */ + __u32 s_fsize; /* size of fragments */ + __u32 s_fpb; /* fragments per block */ + __u32 s_minfree; /* minimum percentage of free blocks */ + __u32 s_bmask; /* `blkoff'' calc of blk offsets */ + __u32 s_fmask; /* s_fsize mask */ + __u32 s_bshift; /* `lblkno'' calc of logical blkno */ + __u32 s_fshift; /* s_fsize shift */ + __u32 s_fpbshift; /* fragments per block shift */ + __u32 s_fsbtodb; /* fsbtodb and dbtofsb shift constant */ + __u32 s_sbsize; /* actual size of super block */ + __u32 s_csmask; /* csum block offset */ + __u32 s_csshift; /* csum block number */ + __u32 s_nindir; /* value of NINDIR */ + __u32 s_inopb; /* value of INOPB */ + __u32 s_nspf; /* value of NSPF */ + __u32 s_npsect; /* # sectors/track including spares */ + __u32 s_interleave; /* hardware sector interleave */ + __u32 s_trackskew; /* sector 0 skew, per track */ + __u32 s_csaddr; /* blk addr of cyl grp summary area */ + __u32 s_cssize; /* size of cyl grp summary area */ + __u32 s_cgsize; /* cylinder group size */ + __u32 s_ntrak; /* tracks per cylinder */ + __u32 s_nsect; /* sectors per track */ + __u32 s_spc; /* sectors per cylinder */ + __u32 s_ipg; /* inodes per group */ + __u32 s_fpg; /* fragments per group */ + __u32 s_cpc; /* cyl per cycle in postbl */ + __s64 s_qbmask; /* ~usb_bmask */ + __s64 s_qfmask; /* ~usb_fmask */ + __s32 s_postblformat; /* format of positional layout tables */ + __s32 s_nrpos; /* number of rotational positions */ + __s32 s_postbloff; /* (__s16) rotation block list head */ + __s32 s_rotbloff; /* (__u8) blocks for each rotation */ + + __u32 s_fpbmask; /* fragments per block mask */ + __u32 s_apb; /* address per block */ + __u32 s_2apb; /* address per block^2 */ + __u32 s_3apb; /* address per block^3 */ + __u32 s_apbmask; /* address per block mask */ + __u32 s_apbshift; /* address per block shift */ + __u32 s_2apbshift; /* address per block shift * 2 */ + __u32 s_3apbshift; /* address per block shift * 3 */ + __u32 s_nspfshift; /* number of sector per fragment shift */ + __u32 s_nspb; /* number of sector per block */ + __u32 s_inopf; /* inodes per fragment */ + __u32 s_sbbase; /* offset of NeXTstep superblock */ +}; + + +#define UFS_MAX_GROUP_LOADED 1 +#define UFS_CGNO_EMPTY uspi->s_ncg + struct ufs_sb_info { - struct ufs_superblock * s_raw_sb; - __u32 s_flags; /* internal flags for UFS code */ - __u32 s_ncg; /* used in ufs_read_inode */ - __u32 s_ipg; /* used in ufs_read_inode */ - __u32 s_fpg; - __u32 s_fsize; - __u32 s_fshift; - __u32 s_fmask; - __u32 s_bsize; - __u32 s_bmask; - __u32 s_bshift; - __u32 s_iblkno; - __u32 s_dblkno; - __u32 s_cgoffset; - __u32 s_cgmask; - __u32 s_inopb; - __u32 s_lshift; - __u32 s_lmask; - __u32 s_fsfrag; - __u32 s_blockbase; /* offset of NeXTstep superblock */ + struct ufs_sb_private_info * s_uspi; + struct ufs_csum * s_csp[UFS_MAXCSBUFS]; + int s_rename_lock; + struct wait_queue * s_rename_wait; + unsigned s_swab; + unsigned s_flags; + struct buffer_head ** s_ucg; + struct ufs_cg_private_info * s_ucpi[UFS_MAX_GROUP_LOADED]; + unsigned s_cgno[UFS_MAX_GROUP_LOADED]; + unsigned short s_cg_loaded; +}; + +/* + * Sizes of this structures are: + * ufs_super_block_first 512 + * ufs_super_block_second 512 + * ufs_super_block_third 356 + */ +struct ufs_super_block_first { + __u32 fs_link; + __u32 fs_rlink; + __u32 fs_sblkno; + __u32 fs_cblkno; + __u32 fs_iblkno; + __u32 fs_dblkno; + __u32 fs_cgoffset; + __u32 fs_cgmask; + __u32 fs_time; + __u32 fs_size; + __u32 fs_dsize; + __u32 fs_ncg; + __u32 fs_bsize; + __u32 fs_fsize; + __u32 fs_frag; + __u32 fs_minfree; + __u32 fs_rotdelay; + __u32 fs_rps; + __u32 fs_bmask; + __u32 fs_fmask; + __u32 fs_bshift; + __u32 fs_fshift; + __u32 fs_maxcontig; + __u32 fs_maxbpg; + __u32 fs_fragshift; + __u32 fs_fsbtodb; + __u32 fs_sbsize; + __u32 fs_csmask; + __u32 fs_csshift; + __u32 fs_nindir; + __u32 fs_inopb; + __u32 fs_nspf; + __u32 fs_optim; + __u32 fs_npsect; + __u32 fs_interleave; + __u32 fs_trackskew; + __u32 fs_id[2]; + __u32 fs_csaddr; + __u32 fs_cssize; + __u32 fs_cgsize; + __u32 fs_ntrak; + __u32 fs_nsect; + __u32 fs_spc; + __u32 fs_ncyl; + __u32 fs_cpg; + __u32 fs_ipg; + __u32 fs_fpg; + struct ufs_csum fs_cstotal; + __u8 fs_fmod; + __u8 fs_clean; + __u8 fs_ronly; + __u8 fs_flags; + __u8 fs_fsmnt[UFS_MAXMNTLEN - 212]; + +}; + +struct ufs_super_block_second { + __u8 fs_fsmnt[212]; + __u32 fs_cgrotor; + __u32 fs_csp[UFS_MAXCSBUFS]; + __u32 fs_maxcluster; + __u32 fs_cpc; + __u16 fs_opostbl[82]; +}; + +struct ufs_super_block_third { + __u16 fs_opostbl[46]; + union { + struct { + __s32 fs_sparecon[53];/* reserved for future constants */ + __s32 fs_reclaim; + __s32 fs_sparecon2[1]; + __s32 fs_state; /* file system state time stamp */ + __u32 fs_qbmask[2]; /* ~usb_bmask */ + __u32 fs_qfmask[2]; /* ~usb_fmask */ + } fs_sun; + struct { + __s32 fs_sparecon[50];/* reserved for future constants */ + __s32 fs_contigsumsize;/* size of cluster summary array */ + __s32 fs_maxsymlinklen;/* max length of an internal symlink */ + __s32 fs_inodefmt; /* format of on-disk inodes */ + __u32 fs_maxfilesize[2]; /* max representable file size */ + __u32 fs_qbmask[2]; /* ~usb_bmask */ + __u32 fs_qfmask[2]; /* ~usb_fmask */ + __s32 fs_state; /* file system state time stamp */ + } fs_44; + } fs_u; + __s32 fs_postblformat; + __s32 fs_nrpos; + __s32 fs_postbloff; + __s32 fs_rotbloff; + __s32 fs_magic; + __u8 fs_space[1]; }; #endif /* __LINUX_UFS_FS_SB_H */ diff --git a/include/linux/umsdos_fs.h b/include/linux/umsdos_fs.h index b5f6b38c7..c9cfd16e6 100644 --- a/include/linux/umsdos_fs.h +++ b/include/linux/umsdos_fs.h @@ -24,8 +24,8 @@ struct umsdos_fake_info { - char fname[13]; - int len; + char fname[13]; + int len; }; #define UMSDOS_MAXNAME 220 @@ -33,99 +33,106 @@ struct umsdos_fake_info { /* of it is written to disk */ /* nice though it would be, I can't change this and preserve backward compatibility */ struct umsdos_dirent { - unsigned char name_len; /* if == 0, then this entry is not used */ - unsigned char flags; /* UMSDOS_xxxx */ - unsigned short nlink; /* How many hard links point to this entry */ - uid_t uid; /* Owner user id */ - gid_t gid; /* Group id */ - time_t atime; /* Access time */ - time_t mtime; /* Last modification time */ - time_t ctime; /* Creation time */ - dev_t rdev; /* major and minor number of a device */ - /* special file */ - umode_t mode; /* Standard UNIX permissions bits + type of */ - char spare[12]; /* unused bytes for future extensions */ - /* file, see linux/stat.h */ - char name[UMSDOS_MAXNAME]; /* Not '\0' terminated */ - /* but '\0' padded, so it will allow */ - /* for adding news fields in this record */ - /* by reducing the size of name[] */ + unsigned char name_len; /* if == 0, then this entry is not used */ + unsigned char flags; /* UMSDOS_xxxx */ + unsigned short nlink; /* How many hard links point to this entry */ + uid_t uid; /* Owner user id */ + gid_t gid; /* Group id */ + time_t atime; /* Access time */ + time_t mtime; /* Last modification time */ + time_t ctime; /* Creation time */ + dev_t rdev; /* major and minor number of a device */ + /* special file */ + umode_t mode; /* Standard UNIX permissions bits + type of */ + char spare[12]; /* unused bytes for future extensions */ + /* file, see linux/stat.h */ + char name[UMSDOS_MAXNAME]; /* Not '\0' terminated */ + /* but '\0' padded, so it will allow */ + /* for adding news fields in this record */ + /* by reducing the size of name[] */ }; + #define UMSDOS_HIDDEN 1 /* Never show this entry in directory search */ #define UMSDOS_HLINK 2 /* It is a (pseudo) hard link */ /* #Specification: EMD file / record size - Entry are 64 bytes wide in the EMD file. It allows for a 30 characters - name. If a name is longer, contiguous entries are allocated. So a - umsdos_dirent may span multiple records. -*/ + * Entry are 64 bytes wide in the EMD file. It allows for a 30 characters + * name. If a name is longer, contiguous entries are allocated. So a + * umsdos_dirent may span multiple records. + */ + #define UMSDOS_REC_SIZE 64 /* Translation between MSDOS name and UMSDOS name */ -struct umsdos_info{ - int msdos_reject; /* Tell if the file name is invalid for MSDOS */ - /* See umsdos_parse */ - struct umsdos_fake_info fake; - struct umsdos_dirent entry; - off_t f_pos; /* offset of the entry in the EMD file */ - /* or offset where the entry may be store */ - /* if it is a new entry */ - int recsize; /* Record size needed to store entry */ +struct umsdos_info { + int msdos_reject; /* Tell if the file name is invalid for MSDOS */ + /* See umsdos_parse */ + struct umsdos_fake_info fake; + struct umsdos_dirent entry; + off_t f_pos; /* offset of the entry in the EMD file + * or offset where the entry may be store + * if it is a new entry + */ + int recsize; /* Record size needed to store entry */ }; -/* Definitions for ioctl (number randomly chosen) */ -/* The next ioctl commands operate only on the DOS directory */ -/* The file umsdos_progs/umsdosio.c contain a string table */ -/* based on the order of those definition. Keep it in sync */ -#define UMSDOS_READDIR_DOS _IO(0x04,210) /* Do a readdir of the DOS directory */ -#define UMSDOS_UNLINK_DOS _IO(0x04,211) /* Erase in the DOS directory only */ -#define UMSDOS_RMDIR_DOS _IO(0x04,212) /* rmdir in the DOS directory only */ -#define UMSDOS_STAT_DOS _IO(0x04,213) /* Get info about a file */ +/* Definitions for ioctl (number randomly chosen) + * The next ioctl commands operate only on the DOS directory + * The file umsdos_progs/umsdosio.c contain a string table + * based on the order of those definition. Keep it in sync + */ +#define UMSDOS_READDIR_DOS _IO(0x04,210) /* Do a readdir of the DOS directory */ +#define UMSDOS_UNLINK_DOS _IO(0x04,211) /* Erase in the DOS directory only */ +#define UMSDOS_RMDIR_DOS _IO(0x04,212) /* rmdir in the DOS directory only */ +#define UMSDOS_STAT_DOS _IO(0x04,213) /* Get info about a file */ + /* The next ioctl commands operate only on the EMD file */ -#define UMSDOS_CREAT_EMD _IO(0x04,214) /* Create a file */ -#define UMSDOS_UNLINK_EMD _IO(0x04,215) /* unlink (rmdir) a file */ -#define UMSDOS_READDIR_EMD _IO(0x04,216) /* read the EMD file only. */ -#define UMSDOS_GETVERSION _IO(0x04,217) /* Get the release number of UMSDOS */ -#define UMSDOS_INIT_EMD _IO(0x04,218) /* Create the EMD file if not there */ -#define UMSDOS_DOS_SETUP _IO(0x04,219) /* Set the defaults of the MsDOS driver */ - -#define UMSDOS_RENAME_DOS _IO(0x04,220) /* rename a file/directory in the DOS */ - /* directory only */ -struct umsdos_ioctl{ - struct dirent dos_dirent; - struct umsdos_dirent umsdos_dirent; - /* The following structure is used to exchange some data */ - /* with utilities (umsdos_progs/util/umsdosio.c). The first */ - /* releases were using struct stat from "sys/stat.h". This was */ - /* causing some problem for cross compilation of the kernel */ - /* Since I am not really using the structure stat, but only some field */ - /* of it, I have decided to replicate the structure here */ - /* for compatibility with the binaries out there */ - /* FIXME PTW 1998, this has probably changed */ - struct { - dev_t st_dev; - unsigned short __pad1; - ino_t st_ino; - umode_t st_mode; - nlink_t st_nlink; - uid_t st_uid; - gid_t st_gid; - dev_t st_rdev; - unsigned short __pad2; - off_t st_size; - unsigned long st_blksize; - unsigned long st_blocks; - time_t st_atime; - unsigned long __unused1; - time_t st_mtime; - unsigned long __unused2; - time_t st_ctime; - unsigned long __unused3; - unsigned long __unused4; - unsigned long __unused5; - }stat; - char version,release; +#define UMSDOS_CREAT_EMD _IO(0x04,214) /* Create a file */ +#define UMSDOS_UNLINK_EMD _IO(0x04,215) /* unlink (rmdir) a file */ +#define UMSDOS_READDIR_EMD _IO(0x04,216) /* read the EMD file only. */ +#define UMSDOS_GETVERSION _IO(0x04,217) /* Get the release number of UMSDOS */ +#define UMSDOS_INIT_EMD _IO(0x04,218) /* Create the EMD file if not there */ +#define UMSDOS_DOS_SETUP _IO(0x04,219) /* Set the defaults of the MsDOS driver */ + +#define UMSDOS_RENAME_DOS _IO(0x04,220) /* rename a file/directory in the DOS + * directory only */ +struct umsdos_ioctl { + struct dirent dos_dirent; + struct umsdos_dirent umsdos_dirent; + /* The following structure is used to exchange some data + * with utilities (umsdos_progs/util/umsdosio.c). The first + * releases were using struct stat from "sys/stat.h". This was + * causing some problem for cross compilation of the kernel + * Since I am not really using the structure stat, but only some field + * of it, I have decided to replicate the structure here + * for compatibility with the binaries out there + * FIXME PTW 1998, this has probably changed + */ + + struct { + dev_t st_dev; + unsigned short __pad1; + ino_t st_ino; + umode_t st_mode; + nlink_t st_nlink; + uid_t st_uid; + gid_t st_gid; + dev_t st_rdev; + unsigned short __pad2; + off_t st_size; + unsigned long st_blksize; + unsigned long st_blocks; + time_t st_atime; + unsigned long __unused1; + time_t st_mtime; + unsigned long __unused2; + time_t st_ctime; + unsigned long __unused3; + unsigned long __unused4; + unsigned long __unused5; + } stat; + char version, release; }; /* Different macros to access struct umsdos_dirent */ @@ -138,15 +145,15 @@ struct umsdos_ioctl{ #endif extern struct inode_operations umsdos_dir_inode_operations; -extern struct file_operations umsdos_file_operations; +extern struct file_operations umsdos_file_operations; extern struct inode_operations umsdos_file_inode_operations; extern struct inode_operations umsdos_file_inode_operations_no_bmap; extern struct inode_operations umsdos_file_inode_operations_readpage; extern struct inode_operations umsdos_symlink_inode_operations; -extern int init_umsdos_fs(void); +extern int init_umsdos_fs (void); #include <linux/umsdos_fs.p> -#endif /* __KERNEL__ */ +#endif /* __KERNEL__ */ #endif diff --git a/include/linux/umsdos_fs.p b/include/linux/umsdos_fs.p index 586f168fe..0a7475a1c 100644 --- a/include/linux/umsdos_fs.p +++ b/include/linux/umsdos_fs.p @@ -27,12 +27,6 @@ int UMSDOS_lookup(struct inode *dir,struct dentry *dentry); int umsdos_hlink2inode (struct inode *hlink, struct inode **result); /* emd.c 22/06/95 00.22.04 */ -void fill_new_filp (struct file *filp, struct dentry *dentry); -void kill_dentry (struct dentry *dentry); -struct dentry *creat_dentry (const char *name, - const int len, - struct inode *inode, - struct dentry *parent); ssize_t umsdos_file_write_kmem_real (struct file *filp, const char *buf, size_t count, @@ -77,6 +71,16 @@ int umsdos_findentry (struct inode *dir, int expect); /* file.c 25/01/95 02.25.38 */ /* inode.c 12/06/95 09.49.40 */ +inline struct dentry *geti_dentry (struct inode *inode); +inline void inc_count (struct inode *inode); +void check_inode (struct inode *inode); +void check_dentry (struct dentry *dentry); +void fill_new_filp (struct file *filp, struct dentry *dentry); +void kill_dentry (struct dentry *dentry); +struct dentry *creat_dentry (const char *name, + const int len, + struct inode *inode, + struct dentry *parent); void UMSDOS_put_inode (struct inode *inode); void UMSDOS_put_super (struct super_block *sb); int UMSDOS_statfs (struct super_block *sb, diff --git a/include/linux/umsdos_fs_i.h b/include/linux/umsdos_fs_i.h index 1020179eb..dea618561 100644 --- a/include/linux/umsdos_fs_i.h +++ b/include/linux/umsdos_fs_i.h @@ -4,65 +4,68 @@ #ifndef _LINUX_TYPES_H #include <linux/types.h> #endif + #include <linux/msdos_fs_i.h> #include <linux/pipe_fs_i.h> /* #Specification: strategy / in memory inode - Here is the information specific to the inode of the UMSDOS file - system. This information is added to the end of the standard struct - inode. Each file system has its own extension to struct inode, - so do the umsdos file system. - - The strategy is to have the umsdos_inode_info as a superset of - the msdos_inode_info, since most of the time the job is done - by the msdos fs code. - - So we duplicate the msdos_inode_info, and add our own info at the - end. - - For all file type (and directory) the inode has a reference to: - the directory which hold this entry: i_dir_owner - The EMD file of i_dir_owner: i_emd_owner - The offset in this EMD file of the entry: pos - - For directory, we also have a reference to the inode of its - own EMD file. Also, we have dir_locking_info to help synchronise - file creation and file lookup. This data is sharing space with - the pipe_inode_info not used by directory. See also msdos_fs_i.h - for more information about pipe_inode_info and msdos_inode_info. + * Here is the information specific to the inode of the UMSDOS file + * system. This information is added to the end of the standard struct + * inode. Each file system has its own extension to struct inode, + * so do the umsdos file system. + * + * The strategy is to have the umsdos_inode_info as a superset of + * the msdos_inode_info, since most of the time the job is done + * by the msdos fs code. + * + * So we duplicate the msdos_inode_info, and add our own info at the + * end. + * + * For all file type (and directory) the inode has a reference to: + * the directory which hold this entry: i_dir_owner + * The EMD file of i_dir_owner: i_emd_owner + * The offset in this EMD file of the entry: pos + * + * For directory, we also have a reference to the inode of its + * own EMD file. Also, we have dir_locking_info to help synchronise + * file creation and file lookup. This data is sharing space with + * the pipe_inode_info not used by directory. See also msdos_fs_i.h + * for more information about pipe_inode_info and msdos_inode_info. + * + * Special file and fifo do have an inode which correspond to an + * empty MSDOS file. + * + * symlink are processed mostly like regular file. The content is the + * link. + * + * fifos add there own extension to the inode. I have reserved some + * space for fifos side by side with msdos_inode_info. This is just + * to for the show, because msdos_inode_info already include the + * pipe_inode_info. + * + * The UMSDOS specific extension is placed after the union. + */ - Special file and fifo do have an inode which correspond to an - empty MSDOS file. - - symlink are processed mostly like regular file. The content is the - link. - - fifos add there own extension to the inode. I have reserved some - space for fifos side by side with msdos_inode_info. This is just - to for the show, because msdos_inode_info already include the - pipe_inode_info. - - The UMSDOS specific extension is placed after the union. -*/ struct dir_locking_info { struct wait_queue *p; - short int looking; /* How many process doing a lookup */ - short int creating; /* Is there any creation going on here */ - /* Only one at a time, although one */ - /* may recursively lock, so it is a counter */ - long pid; /* pid of the process owning the creation */ - /* lock */ + short int looking; /* How many process doing a lookup */ + short int creating; /* Is there any creation going on here + * Only one at a time, although one + * may recursively lock, so it is a counter + */ + long pid; /* pid of the process owning the creation */ + /* lock */ }; + struct umsdos_inode_info { union { struct msdos_inode_info msdos_info; struct pipe_inode_info pipe_info; struct dir_locking_info dir_info; - }u; /* Simply a filler, never referenced by fs/umsdos/... */ - unsigned long i_dir_owner; /* Inode of the dir which hold this */ - /* entry */ + } u; /* Simply a filler, never referenced by fs/umsdos/... */ + unsigned long i_dir_owner; /* Inode of the dir which hold this entry */ unsigned long i_emd_owner; /* Inode of the EMD file of i_dir_owner */ - off_t pos; /* Entry offset in the emd_owner file */ + off_t pos; /* Entry offset in the emd_owner file */ /* The rest is used only if this inode describe a directory */ unsigned long i_emd_dir; /* Inode of the EMD file of this inode */ }; diff --git a/include/linux/utsname.h b/include/linux/utsname.h index 7aef28fc3..a83503f99 100644 --- a/include/linux/utsname.h +++ b/include/linux/utsname.h @@ -32,4 +32,5 @@ struct new_utsname { extern struct new_utsname system_utsname; +extern struct semaphore uts_sem; #endif diff --git a/include/linux/videodev.h b/include/linux/videodev.h index 960ffad9a..701fb8870 100644 --- a/include/linux/videodev.h +++ b/include/linux/videodev.h @@ -3,6 +3,8 @@ #ifdef __KERNEL__ +#include <linux/poll.h> + struct video_device { char name[32]; @@ -14,6 +16,7 @@ struct video_device long (*read)(struct video_device *, char *, unsigned long, int noblock); /* Do we need a write method ? */ long (*write)(struct video_device *, const char *, unsigned long, int noblock); + unsigned int (*poll)(struct video_device *, struct file *, poll_table *); int (*ioctl)(struct video_device *, unsigned int , void *); int (*mmap)(struct video_device *, const char *, unsigned long); int (*initialize)(struct video_device *); @@ -80,11 +83,14 @@ struct video_tuner #define VIDEO_TUNER_PAL 1 #define VIDEO_TUNER_NTSC 2 #define VIDEO_TUNER_SECAM 4 +#define VIDEO_TUNER_LOW 8 /* Uses KHz not MHz */ +#define VIDEO_TUNER_STEREO_ON 128 /* Tuner is seeing stereo */ __u16 mode; /* PAL/NTSC/SECAM/OTHER */ #define VIDEO_MODE_PAL 0 #define VIDEO_MODE_NTSC 1 #define VIDEO_MODE_SECAM 2 #define VIDEO_MODE_AUTO 3 + __u16 signal; /* Signal strength 16bit scale */ }; struct video_picture @@ -102,6 +108,14 @@ struct video_picture #define VIDEO_PALETTE_RGB24 4 /* 24bit RGB */ #define VIDEO_PALETTE_RGB32 5 /* 32bit RGB */ #define VIDEO_PALETTE_RGB555 6 /* 555 15bit RGB */ +#define VIDEO_PALETTE_YUV422 7 /* YUV422 capture */ +#define VIDEO_PALETTE_YUYV 8 +#define VIDEO_PALETTE_UYVY 9 /* The great thing about standards is ... */ +#define VIDEO_PALETTE_YUV420 10 +#define VIDEO_PALETTE_YUV411 11 /* YUV411 capture */ +#define VIDEO_PALETTE_RAW 12 /* RAW capture (BT848) */ +#define VIDEO_PALETTE_YUV422P 13 /* YUV 4:2:2 Planar */ +#define VIDEO_PALETTE_YUV411P 14 /* YUV 4:1:1 Planar */ }; struct video_audio @@ -153,7 +167,7 @@ struct video_mmap { unsigned int frame; /* Frame (0 or 1) for double buffer */ int height,width; - unsigned int format; + unsigned int format; /* should be VIDEO_PALETTE_* */ }; struct video_key @@ -192,6 +206,13 @@ struct video_key #define VID_HARDWARE_QCAM_C 4 #define VID_HARDWARE_PSEUDO 5 #define VID_HARDWARE_SAA5249 6 +#define VID_HARDWARE_AZTECH 7 +#define VID_HARDWARE_SF16MI 8 +#define VID_HARDWARE_RTRACK 9 +#define VID_HARDWARE_ZOLTRIX 10 +#define VID_HARDWARE_SAA7146 11 +#define VID_HARDWARE_VIDEUM 12 /* Reserved for Winnov videum */ +#define VID_HARDWARE_RTRACK2 13 /* * Initialiser list diff --git a/include/linux/videotext.h b/include/linux/videotext.h index bd427fb31..78faf6afe 100644 --- a/include/linux/videotext.h +++ b/include/linux/videotext.h @@ -99,7 +99,7 @@ typedef struct unsigned serial : 1; /* serial mode (C11) */ unsigned notfound : 1; /* /FOUND */ unsigned pblf : 1; /* PBLF */ - unsigned hamming : 1; /* hamming-error occured */ + unsigned hamming : 1; /* hamming-error occurred */ } vtx_pageinfo_t; diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h index cac9992bf..0ddee5b36 100644 --- a/include/linux/vmalloc.h +++ b/include/linux/vmalloc.h @@ -24,20 +24,5 @@ long vread(char *buf, char *addr, unsigned long count); void vmfree_area_pages(unsigned long address, unsigned long size); int vmalloc_area_pages(unsigned long address, unsigned long size, pgprot_t prot); -extern inline void set_pgdir(unsigned long address, pgd_t entry) -{ -#if !defined(__mc68000__) && !defined(__sparc_v9__) - struct task_struct * p; - - read_lock(&tasklist_lock); - for_each_task(p) { - if (!p->mm) - continue; - *pgd_offset(p->mm,address) = entry; - } - read_unlock(&tasklist_lock); -#endif -} - #endif diff --git a/include/linux/vt_buffer.h b/include/linux/vt_buffer.h new file mode 100644 index 000000000..a26c8090d --- /dev/null +++ b/include/linux/vt_buffer.h @@ -0,0 +1,86 @@ +/* + * include/linux/vt_buffer.h -- Access to VT screen buffer + * + * (c) 1998 Martin Mares <mj@ucw.cz> + * + * This is a set of macros and functions which are used in the + * console driver and related code to access the screen buffer. + * In most cases the console works with simple in-memory buffer, + * but when handling hardware text mode consoles, we store + * the foreground console directly in video memory. + */ + +#ifndef _LINUX_VT_BUFFER_H_ +#define _LINUX_VT_BUFFER_H_ + +#include <linux/config.h> + +#ifdef CONFIG_VGA_CONSOLE +#if !defined(CONFIG_FB) && !defined(CONFIG_FB_MODULE) +#define VT_BUF_VRAM_ONLY +#endif +#include <asm/vga.h> +#endif + +#ifndef VT_BUF_HAVE_RW +#define scr_writew(val, addr) (*(addr) = (val)) +#define scr_readw(addr) (*(addr)) +#define scr_memcpyw(d, s, c) memcpy(d, s, c) +#define scr_memmovew(d, s, c) memmove(d, s, c) +#define VT_BUF_HAVE_MEMCPYW +#define VT_BUF_HAVE_MEMMOVEW +#define scr_memcpyw_from(d, s, c) memcpy(d, s, c) +#define scr_memcpyw_to(d, s, c) memcpy(d, s, c) +#define VT_BUF_HAVE_MEMCPYF +#endif + +#ifndef VT_BUF_HAVE_MEMSETW +extern inline void scr_memsetw(u16 *s, u16 c, unsigned int count) +{ + count /= 2; + while (count--) + scr_writew(c, s++); +} +#endif + +#ifndef VT_BUF_HAVE_MEMCPYW +extern inline void scr_memcpyw(u16 *d, u16 *s, unsigned int count) +{ + count /= 2; + while (count--) + scr_writew(scr_readw(s++), d++); +} +#endif + +#ifndef VT_BUF_HAVE_MEMMOVEW +extern inline void scr_memmovew(u16 *d, u16 *s, unsigned int count) +{ + if (d < s) + scr_memcpyw(d, s, count); + else { + count /= 2; + d += count; + s += count; + while (count--) + scr_writew(scr_readw(--s), --d); + } +} +#endif + +#ifndef VT_BUF_HAVE_MEMCPYF +extern inline void scr_memcpyw_from(u16 *d, u16 *s, unsigned int count) +{ + count /= 2; + while (count--) + *d++ = scr_readw(s++); +} + +extern inline void scr_memcpyw_to(u16 *d, u16 *s, unsigned int count) +{ + count /= 2; + while (count--) + scr_writew(*s++, d++); +} +#endif + +#endif diff --git a/include/linux/vt_kern.h b/include/linux/vt_kern.h index 1692f991c..e4f48e908 100644 --- a/include/linux/vt_kern.h +++ b/include/linux/vt_kern.h @@ -6,6 +6,7 @@ * with information needed by the vt package */ +#include <linux/config.h> #include <linux/vt.h> /* @@ -16,14 +17,13 @@ * fixed. The linux/Documentation directory includes a code snippet * to save and restore the text font. */ +#ifdef CONFIG_VGA_CONSOLE #define BROKEN_GRAPHICS_PROGRAMS 1 +#endif extern struct vt_struct { int vc_num; /* The console number */ unsigned char vc_mode; /* KD_TEXT, ... */ - unsigned char vc_kbdraw; - unsigned char vc_kbde0; - unsigned char vc_kbdleds; struct vt_mode vt_mode; int vt_pid; int vt_newvt; @@ -31,9 +31,61 @@ extern struct vt_struct { } *vt_cons[MAX_NR_CONSOLES]; void (*kd_mksound)(unsigned int hz, unsigned int ticks); -int vc_allocate(unsigned int console); + +/* console.c */ + +struct console_font_op; + +int vc_allocate(unsigned int console, int init); int vc_cons_allocated(unsigned int console); -int vc_resize(unsigned long lines, unsigned long cols); +int vc_resize(unsigned int lines, unsigned int cols, + unsigned int first, unsigned int last); +#define vc_resize_all(l, c) vc_resize(l, c, 0, MAX_NR_CONSOLES-1) +#define vc_resize_con(l, c, x) vc_resize(l, c, x, x) void vc_disallocate(unsigned int console); +void poke_blanked_console(void); +void set_vesa_blanking(unsigned long arg); +void vesa_blank(void); +void vesa_powerdown(void); +void reset_palette(int currcons); +void set_palette(void); +void do_blank_screen(int nopowersave); +int con_font_op(int currcons, struct console_font_op *op); +int con_set_cmap(unsigned char *cmap); +int con_get_cmap(unsigned char *cmap); +void scrollback(int); +void scrollfront(int); +void update_region(int currcons, unsigned long start, int count); + +struct tty_struct; +int tioclinux(struct tty_struct *tty, unsigned long arg); + +/* consolemap.c */ + +struct unimapinit; +struct unipair; + +int con_set_trans_old(unsigned char * table); +int con_get_trans_old(unsigned char * table); +int con_set_trans_new(unsigned short * table); +int con_get_trans_new(unsigned short * table); +int con_clear_unimap(int currcons, struct unimapinit *ui); +int con_set_unimap(int currcons, ushort ct, struct unipair *list); +int con_get_unimap(int currcons, ushort ct, ushort *uct, struct unipair *list); +int con_set_default_unimap(int currcons); +void con_free_unimap(int currcons); +void con_protect_unimap(int currcons, int rdonly); + +/* vt.c */ + +extern unsigned int video_font_height; +extern unsigned int default_font_height; +extern unsigned int video_scan_lines; + +void complete_change_console(unsigned int new_console); +int vt_waitactive(int vt); +void change_console(unsigned int); +void reset_vc(unsigned int new_console); +int vt_waitactive(int vt); #endif /* _VT_KERN_H */ diff --git a/include/linux/wavefront.h b/include/linux/wavefront.h new file mode 100644 index 000000000..736fc2747 --- /dev/null +++ b/include/linux/wavefront.h @@ -0,0 +1,670 @@ +#ifndef __wavefront_h__ +#define __wavefront_h__ + +/* WaveFront header file. + * + * Copyright (C) by Paul Barton-Davis 1998 + * + * This program is distributed under the GNU GENERAL PUBLIC LICENSE (GPL) + * Version 2 (June 1991). See the "COPYING" file distributed with this software + * for more info. + */ + +#if (!defined(__GNUC__) && !defined(__GNUG__)) + + You will not be able to compile this file correctly without gcc, because + it is necessary to pack the "wavefront_alias" structure to a size + of 22 bytes, corresponding to 16-bit alignment (as would have been + the case on the original platform, MS-DOS). If this is not done, + then WavePatch-format files cannot be read/written correctly. + The method used to do this here ("__attribute__((packed)") is + completely compiler dependent. + + All other wavefront_* types end up aligned to 32 bit values and + still have the same (correct) size. + +#else + + /* However, note that as of G++ 2.7.3.2, g++ was unable to + correctly parse *type* __attribute__ tags. It will do the + right thing if we use the "packed" attribute on each struct + member, which has the same semantics anyway. + */ + +#endif __GNUC__ + +/***************************** WARNING ******************************** + PLEASE DO NOT MODIFY THIS FILE IN ANY WAY THAT AFFECTS ITS ABILITY TO + BE USED WITH EITHER C *OR* C++. + **********************************************************************/ + +#ifndef NUM_MIDIKEYS +#define NUM_MIDIKEYS 128 +#endif NUM_MIDIKEYS + +#ifndef NUM_MIDICHANNELS +#define NUM_MIDICHANNELS 16 +#endif NUM_MIDICHANNELS + +/* These are very useful/important. the original wavefront interface + was developed on a 16 bit system, where sizeof(int) = 2 + bytes. Defining things like this makes the code much more portable, and + easier to understand without having to toggle back and forth + between a 16-bit view of the world and a 32-bit one. + */ + +typedef short INT16; +typedef unsigned short UINT16; +typedef int INT32; +typedef unsigned int UINT32; +typedef char CHAR8; +typedef unsigned char UCHAR8; + +/* Pseudo-commands not part of the WaveFront command set. + These are used for various driver controls and direct + hardware control. + */ + +#define WFC_DEBUG_DRIVER 0 +#define WFC_FX_IOCTL 1 +#define WFC_PATCH_STATUS 2 +#define WFC_PROGRAM_STATUS 3 +#define WFC_SAMPLE_STATUS 4 +#define WFC_DISABLE_INTERRUPTS 5 +#define WFC_ENABLE_INTERRUPTS 6 +#define WFC_INTERRUPT_STATUS 7 +#define WFC_ROMSAMPLES_RDONLY 8 +#define WFC_IDENTIFY_SLOT_TYPE 9 + +/* Wavefront synth commands + */ + +#define WFC_DOWNLOAD_SAMPLE 0x80 +#define WFC_DOWNLOAD_BLOCK 0x81 +#define WFC_DOWNLOAD_MULTISAMPLE 0x82 +#define WFC_DOWNLOAD_SAMPLE_ALIAS 0x83 +#define WFC_DELETE_SAMPLE 0x84 +#define WFC_REPORT_FREE_MEMORY 0x85 +#define WFC_DOWNLOAD_PATCH 0x86 +#define WFC_DOWNLOAD_PROGRAM 0x87 +#define WFC_SET_SYNTHVOL 0x89 +#define WFC_SET_NVOICES 0x8B +#define WFC_DOWNLOAD_DRUM 0x90 +#define WFC_GET_SYNTHVOL 0x92 +#define WFC_GET_NVOICES 0x94 +#define WFC_DISABLE_CHANNEL 0x9A +#define WFC_ENABLE_CHANNEL 0x9B +#define WFC_MISYNTH_OFF 0x9D +#define WFC_MISYNTH_ON 0x9E +#define WFC_FIRMWARE_VERSION 0x9F +#define WFC_GET_NSAMPLES 0xA0 +#define WFC_DISABLE_DRUM_PROGRAM 0xA2 +#define WFC_UPLOAD_PATCH 0xA3 +#define WFC_UPLOAD_PROGRAM 0xA4 +#define WFC_SET_TUNING 0xA6 +#define WFC_GET_TUNING 0xA7 +#define WFC_VMIDI_ON 0xA8 +#define WFC_VMIDI_OFF 0xA9 +#define WFC_MIDI_STATUS 0xAA +#define WFC_GET_CHANNEL_STATUS 0xAB +#define WFC_DOWNLOAD_SAMPLE_HEADER 0xAC +#define WFC_UPLOAD_SAMPLE_HEADER 0xAD +#define WFC_UPLOAD_MULTISAMPLE 0xAE +#define WFC_UPLOAD_SAMPLE_ALIAS 0xAF +#define WFC_IDENTIFY_SAMPLE_TYPE 0xB0 +#define WFC_DOWNLOAD_EDRUM_PROGRAM 0xB1 +#define WFC_UPLOAD_EDRUM_PROGRAM 0xB2 +#define WFC_SET_EDRUM_CHANNEL 0xB3 +#define WFC_INSTOUT_LEVELS 0xB4 +#define WFC_PEAKOUT_LEVELS 0xB5 +#define WFC_REPORT_CHANNEL_PROGRAMS 0xB6 +#define WFC_HARDWARE_VERSION 0xCF +#define WFC_UPLOAD_SAMPLE_PARAMS 0xD7 +#define WFC_DOWNLOAD_OS 0xF1 +#define WFC_NOOP 0xFF + +#define WF_MAX_SAMPLE 512 +#define WF_MAX_PATCH 256 +#define WF_MAX_PROGRAM 128 + +#define WF_SECTION_MAX 44 /* longest OS section length */ + +/* # of bytes we send to the board when sending it various kinds of + substantive data, such as samples, patches and programs. +*/ + +#define WF_PROGRAM_BYTES 32 +#define WF_PATCH_BYTES 132 +#define WF_SAMPLE_BYTES 27 +#define WF_SAMPLE_HDR_BYTES 25 +#define WF_ALIAS_BYTES 25 +#define WF_DRUM_BYTES 9 +#define WF_MSAMPLE_BYTES 259 /* (MIDI_KEYS * 2) + 3 */ + +#define WF_ACK 0x80 +#define WF_DMA_ACK 0x81 + +/* OR-values for MIDI status bits */ + +#define WF_MIDI_VIRTUAL_ENABLED 0x1 +#define WF_MIDI_VIRTUAL_IS_EXTERNAL 0x2 +#define WF_MIDI_IN_TO_SYNTH_DISABLED 0x4 + +/* See wavefront.c for details */ + +#define WAVEFRONT_MAX_DEVICES 1 /* How many WaveFront cards we can handle */ + +/* slot indexes for struct address_info: makes code a little more mnemonic */ + +#define WF_SYNTH_SLOT 0 +#define WF_INTERNAL_MIDI_SLOT 1 +#define WF_EXTERNAL_MIDI_SLOT 2 + +/* Magic MIDI bytes used to switch I/O streams on the ICS2115 MPU401 + emulation. Note these NEVER show up in output from the device and + should NEVER be used in input unless Virtual MIDI mode has been + disabled. If they do show up as input, the results are unpredictable. +*/ + +#define WF_EXTERNAL_SWITCH 0xFD +#define WF_INTERNAL_SWITCH 0xF9 + +/* Debugging flags */ + +#define WF_DEBUG_CMD 0x1 +#define WF_DEBUG_DATA 0x2 +#define WF_DEBUG_LOAD_PATCH 0x4 +#define WF_DEBUG_IO 0x8 + +/* WavePatch file format stuff */ + +#define WF_WAVEPATCH_VERSION 120; /* Current version number (1.2) */ +#define WF_MAX_COMMENT 64 /* Comment length */ +#define WF_NUM_LAYERS 4 +#define WF_NAME_LENGTH 32 +#define WF_SOURCE_LENGTH 260 + +#define BankFileID "Bank" +#define DrumkitFileID "DrumKit" +#define ProgramFileID "Program" + +struct wf_envelope +{ + UCHAR8 attack_time:7; + UCHAR8 Unused1:1; + + UCHAR8 decay1_time:7; + UCHAR8 Unused2:1; + + UCHAR8 decay2_time:7; + UCHAR8 Unused3:1; + + UCHAR8 sustain_time:7; + UCHAR8 Unused4:1; + + UCHAR8 release_time:7; + UCHAR8 Unused5:1; + + UCHAR8 release2_time:7; + UCHAR8 Unused6:1; + + CHAR8 attack_level; + CHAR8 decay1_level; + CHAR8 decay2_level; + CHAR8 sustain_level; + CHAR8 release_level; + + UCHAR8 attack_velocity:7; + UCHAR8 Unused7:1; + + UCHAR8 volume_velocity:7; + UCHAR8 Unused8:1; + + UCHAR8 keyboard_scaling:7; + UCHAR8 Unused9:1; +}; +typedef struct wf_envelope wavefront_envelope; + +struct wf_lfo +{ + UCHAR8 sample_number; + + UCHAR8 frequency:7; + UCHAR8 Unused1:1; + + UCHAR8 am_src:4; + UCHAR8 fm_src:4; + + CHAR8 fm_amount; + CHAR8 am_amount; + CHAR8 start_level; + CHAR8 end_level; + + UCHAR8 ramp_delay:7; + UCHAR8 wave_restart:1; /* for LFO2 only */ + + UCHAR8 ramp_time:7; + UCHAR8 Unused2:1; +}; +typedef struct wf_lfo wavefront_lfo; + +struct wf_patch +{ + INT16 frequency_bias; /* ** THIS IS IN MOTOROLA FORMAT!! ** */ + + UCHAR8 amplitude_bias:7; + UCHAR8 Unused1:1; + + UCHAR8 portamento:7; + UCHAR8 Unused2:1; + + UCHAR8 sample_number; + + UCHAR8 pitch_bend:4; + UCHAR8 sample_msb:1; + UCHAR8 Unused3:3; + + UCHAR8 mono:1; + UCHAR8 retrigger:1; + UCHAR8 nohold:1; + UCHAR8 restart:1; + UCHAR8 filterconfig:2; /* SDK says "not used" */ + UCHAR8 reuse:1; + UCHAR8 reset_lfo:1; + + UCHAR8 fm_src2:4; + UCHAR8 fm_src1:4; + + CHAR8 fm_amount1; + CHAR8 fm_amount2; + + UCHAR8 am_src:4; + UCHAR8 Unused4:4; + + CHAR8 am_amount; + + UCHAR8 fc1_mode:4; + UCHAR8 fc2_mode:4; + + CHAR8 fc1_mod_amount; + CHAR8 fc1_keyboard_scaling; + CHAR8 fc1_bias; + CHAR8 fc2_mod_amount; + CHAR8 fc2_keyboard_scaling; + CHAR8 fc2_bias; + + UCHAR8 randomizer:7; + UCHAR8 Unused5:1; + + struct wf_envelope envelope1; + struct wf_envelope envelope2; + struct wf_lfo lfo1; + struct wf_lfo lfo2; +}; +typedef struct wf_patch wavefront_patch; + +struct wf_layer +{ + UCHAR8 patch_number; + + UCHAR8 mix_level:7; + UCHAR8 mute:1; + + UCHAR8 split_point:7; + UCHAR8 updown:1; + + UCHAR8 pan_mod_src:2; + UCHAR8 pan_or_mod:1; + UCHAR8 pan:4; + UCHAR8 split_type:1; +}; +typedef struct wf_layer wavefront_layer; + +struct wf_program +{ + struct wf_layer layer[WF_NUM_LAYERS]; +}; +typedef struct wf_program wavefront_program; + +struct wf_sample_offset +{ + INT32 Fraction:4; + INT32 Integer:20; + INT32 Unused:8; +}; +typedef struct wf_sample_offset wavefront_sample_offset; + +/* Sample slot types */ + +#define WF_ST_SAMPLE 0 +#define WF_ST_MULTISAMPLE 1 +#define WF_ST_ALIAS 2 +#define WF_ST_EMPTY 3 + +/* pseudo's */ + +#define WF_ST_DRUM 4 +#define WF_ST_PROGRAM 5 +#define WF_ST_PATCH 6 +#define WF_ST_SAMPLEHDR 7 + +#define WF_ST_MASK 0xf + +/* Flags for slot status. These occupy the upper bits of the same byte + as a sample type. +*/ + +#define WF_SLOT_USED 0x80 /* XXX don't rely on this being accurate */ +#define WF_SLOT_FILLED 0x40 +#define WF_SLOT_ROM 0x20 + +#define WF_SLOT_MASK 0xf0 + +/* channel constants */ + +#define WF_CH_MONO 0 +#define WF_CH_LEFT 1 +#define WF_CH_RIGHT 2 + +/* Sample formats */ + +#define LINEAR_16BIT 0 +#define WHITE_NOISE 1 +#define LINEAR_8BIT 2 +#define MULAW_8BIT 3 + +#define WF_SAMPLE_IS_8BIT(smpl) ((smpl)->SampleResolution&2) + + +/* + + Because most/all of the sample data we pass in via pointers has + never been copied (just mmap-ed into user space straight from the + disk), it would be nice to allow handling of multi-channel sample + data without forcing user-level extraction of the relevant bytes. + + So, we need a way of specifying which channel to use (the WaveFront + only handles mono samples in a given slot), and the only way to do + this without using some struct other than wavefront_sample as the + interface is the awful hack of using the unused bits in a + wavefront_sample: + + Val Meaning + --- ------- + 0 no channel selection (use channel 1, sample is MONO) + 1 use first channel, and skip one + 2 use second channel, and skip one + 3 use third channel, and skip two + 4 use fourth channel, skip three + 5 use fifth channel, skip four + 6 use six channel, skip five + + + This can handle up to 4 channels, and anyone downloading >4 channels + of sample data just to select one of them needs to find some tools + like sox ... + + NOTE: values 0, 1 and 2 correspond to WF_CH_* above. This is + important. + +*/ + +#define WF_SET_CHANNEL(samp,chn) \ + (samp)->Unused1 = chn & 0x1; \ + (samp)->Unused2 = chn & 0x2; \ + (samp)->Unused3 = chn & 0x4 + +#define WF_GET_CHANNEL(samp) \ + (((samp)->Unused3 << 2)|((samp)->Unused2<<1)|(samp)->Unused1) + +typedef struct wf_sample { + struct wf_sample_offset sampleStartOffset; + struct wf_sample_offset loopStartOffset; + struct wf_sample_offset loopEndOffset; + struct wf_sample_offset sampleEndOffset; + INT16 FrequencyBias; + UCHAR8 SampleResolution:2; /* sample_format */ + UCHAR8 Unused1:1; + UCHAR8 Loop:1; + UCHAR8 Bidirectional:1; + UCHAR8 Unused2:1; + UCHAR8 Reverse:1; + UCHAR8 Unused3:1; +} wavefront_sample; + +typedef struct wf_multisample { + INT16 NumberOfSamples; /* log2 of the number of samples */ + INT16 SampleNumber[NUM_MIDIKEYS]; +} wavefront_multisample; + +typedef struct wf_alias { + INT16 OriginalSample __attribute__ ((packed)); + + struct wf_sample_offset sampleStartOffset __attribute__ ((packed)); + struct wf_sample_offset loopStartOffset __attribute__ ((packed)); + struct wf_sample_offset sampleEndOffset __attribute__ ((packed)); + struct wf_sample_offset loopEndOffset __attribute__ ((packed)); + + INT16 FrequencyBias __attribute__ ((packed)); + + UCHAR8 SampleResolution:2 __attribute__ ((packed)); + UCHAR8 Unused1:1 __attribute__ ((packed)); + UCHAR8 Loop:1 __attribute__ ((packed)); + UCHAR8 Bidirectional:1 __attribute__ ((packed)); + UCHAR8 Unused2:1 __attribute__ ((packed)); + UCHAR8 Reverse:1 __attribute__ ((packed)); + UCHAR8 Unused3:1 __attribute__ ((packed)); + + /* This structure is meant to be padded only to 16 bits on their + original. Of course, whoever wrote their documentation didn't + realize that sizeof(struct) can be >= + sum(sizeof(struct-fields)) and so thought that giving a C level + description of the structs used in WavePatch files was + sufficient. I suppose it was, as long as you remember the + standard 16->32 bit issues. + */ + + UCHAR8 sixteen_bit_padding __attribute__ ((packed)); +} wavefront_alias; + +typedef struct wf_drum { + UCHAR8 PatchNumber; + UCHAR8 MixLevel:7; + UCHAR8 Unmute:1; + UCHAR8 Group:4; + UCHAR8 Unused1:4; + UCHAR8 PanModSource:2; + UCHAR8 PanModulated:1; + UCHAR8 PanAmount:4; + UCHAR8 Unused2:1; +} wavefront_drum; + +typedef struct wf_drumkit { + struct wf_drum drum[NUM_MIDIKEYS]; +} wavefront_drumkit; + +typedef struct wf_channel_programs { + UCHAR8 Program[NUM_MIDICHANNELS]; +} wavefront_channel_programs; + +/* How to get MIDI channel status from the data returned by + a WFC_GET_CHANNEL_STATUS command (a struct wf_channel_programs) +*/ + +#define WF_CHANNEL_STATUS(ch,wcp) (wcp)[(ch/7)] & (1<<((ch)%7)) + +typedef union wf_any { + wavefront_sample s; + wavefront_multisample ms; + wavefront_alias a; + wavefront_program pr; + wavefront_patch p; + wavefront_drum d; +} wavefront_any; + +/* Hannu Savolainen hoped that his "patch_info" struct in soundcard.h + might work for other wavetable-based patch-loading situations. + Alas, his fears were correct. The WaveFront doesn't even come with + just "patches", but several different kinds of structures that + control the process of generating sound. + */ + +typedef struct wf_patch_info { + + INT16 key; /* Use WAVEFRONT_PATCH here */ + UINT16 devno; /* fill in when sending */ + UCHAR8 subkey; /* WF_ST_{SAMPLE,ALIAS,etc.} */ + UINT16 number; /* patch/sample/prog number */ + + UINT32 size; /* size of any data included in + one of the fields in `hdrptr', or + as `dataptr'. + + NOTE: for actual samples, this is + the size of the *SELECTED CHANNEL* + even if more data is actually available. + + So, a stereo sample (2 channels) of + 6000 bytes total has `size' = 3000. + + See the macros and comments for + WF_{GET,SET}_CHANNEL above. + + */ + wavefront_any *hdrptr; /* user-space ptr to hdr bytes */ + UINT16 *dataptr; /* actual sample data */ + + wavefront_any hdr; /* kernel-space copy of hdr bytes */ +} wavefront_patch_info; + +/* The maximum number of bytes we will ever move to or from user space + in response to a WFC_* command. This obviously doesn't cover + actual sample data. +*/ + +#define WF_MAX_READ sizeof(wavefront_multisample) +#define WF_MAX_WRITE sizeof(wavefront_multisample) + +/* + This allows us to execute any WF command except the download/upload + ones, which are handled differently due to copyin/copyout issues as + well as data-nybbling to/from the card. + */ + +typedef struct wavefront_control { + int devno; /* from /dev/sequencer interface */ + int cmd; /* WFC_* */ + char status; /* return status to user-space */ + unsigned char rbuf[WF_MAX_READ]; /* bytes read from card */ + unsigned char wbuf[WF_MAX_WRITE]; /* bytes written to card */ +} wavefront_control; + +/* Modulator table */ + +#define WF_MOD_LFO1 0 +#define WF_MOD_LFO2 1 +#define WF_MOD_ENV1 2 +#define WF_MOD_ENV2 3 +#define WF_MOD_KEYBOARD 4 +#define WF_MOD_LOGKEY 5 +#define WF_MOD_VELOCITY 6 +#define WF_MOD_LOGVEL 7 +#define WF_MOD_RANDOM 8 +#define WF_MOD_PRESSURE 9 +#define WF_MOD_MOD_WHEEL 10 +#define WF_MOD_1 WF_MOD_MOD_WHEEL +#define WF_MOD_BREATH 11 +#define WF_MOD_2 WF_MOD_BREATH +#define WF_MOD_FOOT 12 +#define WF_MOD_4 WF_MOD_FOOT +#define WF_MOD_VOLUME 13 +#define WF_MOD_7 WF_MOD_VOLUME +#define WF_MOD_PAN 14 +#define WF_MOD_10 WF_MOD_PAN +#define WF_MOD_EXPR 15 +#define WF_MOD_11 WF_MOD_EXPR + +/* FX-related material */ + +typedef struct wf_fx_info { + int request; /* see list below */ + int data[4]; /* we don't need much */ +} wavefront_fx_info; + +/* support for each of these will be forthcoming once I or someone + else has figured out which of the addresses on page 6 and page 7 of + the YSS225 control each parameter. Incidentally, these come from + the Windows driver interface, but again, Turtle Beach didn't + document the API to use them. +*/ + +#define WFFX_SETOUTGAIN 0 +#define WFFX_SETSTEREOOUTGAIN 1 +#define WFFX_SETREVERBIN1GAIN 2 +#define WFFX_SETREVERBIN2GAIN 3 +#define WFFX_SETREVERBIN3GAIN 4 +#define WFFX_SETCHORUSINPORT 5 +#define WFFX_SETREVERBIN1PORT 6 +#define WFFX_SETREVERBIN2PORT 7 +#define WFFX_SETREVERBIN3PORT 8 +#define WFFX_SETEFFECTPORT 9 +#define WFFX_SETAUXPORT 10 +#define WFFX_SETREVERBTYPE 11 +#define WFFX_SETREVERBDELAY 12 +#define WFFX_SETCHORUSLFO 13 +#define WFFX_SETCHORUSPMD 14 +#define WFFX_SETCHORUSAMD 15 +#define WFFX_SETEFFECT 16 +#define WFFX_SETBASEALL 17 +#define WFFX_SETREVERBALL 18 +#define WFFX_SETCHORUSALL 20 +#define WFFX_SETREVERBDEF 22 +#define WFFX_SETCHORUSDEF 23 +#define WFFX_DELAYSETINGAIN 24 +#define WFFX_DELAYSETFBGAIN 25 +#define WFFX_DELAYSETFBLPF 26 +#define WFFX_DELAYSETGAIN 27 +#define WFFX_DELAYSETTIME 28 +#define WFFX_DELAYSETFBTIME 29 +#define WFFX_DELAYSETALL 30 +#define WFFX_DELAYSETDEF 32 +#define WFFX_SDELAYSETINGAIN 33 +#define WFFX_SDELAYSETFBGAIN 34 +#define WFFX_SDELAYSETFBLPF 35 +#define WFFX_SDELAYSETGAIN 36 +#define WFFX_SDELAYSETTIME 37 +#define WFFX_SDELAYSETFBTIME 38 +#define WFFX_SDELAYSETALL 39 +#define WFFX_SDELAYSETDEF 41 +#define WFFX_DEQSETINGAIN 42 +#define WFFX_DEQSETFILTER 43 +#define WFFX_DEQSETALL 44 +#define WFFX_DEQSETDEF 46 +#define WFFX_MUTE 47 +#define WFFX_FLANGESETBALANCE 48 +#define WFFX_FLANGESETDELAY 49 +#define WFFX_FLANGESETDWFFX_TH 50 +#define WFFX_FLANGESETFBGAIN 51 +#define WFFX_FLANGESETINGAIN 52 +#define WFFX_FLANGESETLFO 53 +#define WFFX_FLANGESETALL 54 +#define WFFX_FLANGESETDEF 56 +#define WFFX_PITCHSETSHIFT 57 +#define WFFX_PITCHSETBALANCE 58 +#define WFFX_PITCHSETALL 59 +#define WFFX_PITCHSETDEF 61 +#define WFFX_SRSSETINGAIN 62 +#define WFFX_SRSSETSPACE 63 +#define WFFX_SRSSETCENTER 64 +#define WFFX_SRSSETGAIN 65 +#define WFFX_SRSSETMODE 66 +#define WFFX_SRSSETDEF 68 + +/* Allow direct user-space control over FX memory/coefficient data. + In theory this could be used to download the FX microprogram, + but it would be a little slower, and involve some weird code. + */ + +#define WFFX_MEMSET 69 + +#endif __wavefront_h__ diff --git a/include/linux/zorro.h b/include/linux/zorro.h index 05e62462a..e156b5bac 100644 --- a/include/linux/zorro.h +++ b/include/linux/zorro.h @@ -1,12 +1,7 @@ /* - * linux/zorro.h -- Amiga AutoConfig (Zorro) Expansion Device Definitions + * linux/zorro.h -- Amiga AutoConfig (Zorro) Bus Definitions * - * Copyright (C) 1995 Geert Uytterhoeven - * - * Please update arch/m68k/amiga/zorro.c if you make changes here! - * - * Many IDs were obtained from ExpName/Identify ((C) Richard Körber) - * and by looking at the NetBSD-Amiga kernel sources + * Copyright (C) 1995-1998 Geert Uytterhoeven * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of this archive @@ -19,52 +14,6 @@ #ifndef __ASSEMBLY__ /* - * Zorro Product Classes - * - * Make sure to keep these in sync with arch/m68k/amiga/zorro.c! - */ - -enum Zorro_Classes { - ZORRO_CLASS_UNKNOWN = 0x00, - ZORRO_CLASS_ARCNET, - ZORRO_CLASS_AUDIO, - ZORRO_CLASS_BRIDGE, - ZORRO_CLASS_DSP, - ZORRO_CLASS_ETHERNET, - ZORRO_CLASS_ETHERNET_PARALLEL, - ZORRO_CLASS_FLASHROM, - ZORRO_CLASS_FPU_RAM, - ZORRO_CLASS_GFX, - ZORRO_CLASS_GFXRAM, - ZORRO_CLASS_HD, - ZORRO_CLASS_HD_RAM, - ZORRO_CLASS_IDE, - ZORRO_CLASS_IDE_RAM, - ZORRO_CLASS_IDE_FLOPPY, - ZORRO_CLASS_ISDN, - ZORRO_CLASS_MACEMU, - ZORRO_CLASS_MISC, - ZORRO_CLASS_MODEM, - ZORRO_CLASS_MULTIIO, - ZORRO_CLASS_RAM, - ZORRO_CLASS_SCANNER, - ZORRO_CLASS_SCSI, - ZORRO_CLASS_SCSI_IDE, - ZORRO_CLASS_SCSI_RAM, - ZORRO_CLASS_SCSI_SERIAL, - ZORRO_CLASS_SERIAL, - ZORRO_CLASS_TABLET, - ZORRO_CLASS_TURBO, - ZORRO_CLASS_TURBO_RAM, - ZORRO_CLASS_TURBO_HD, - ZORRO_CLASS_TURBO_IDE, - ZORRO_CLASS_TURBO_SCSI, - ZORRO_CLASS_TURBO_SCSI_RAM, - ZORRO_CLASS_VIDEO, -}; - - - /* * Known Zorro Boards * * Each Zorro board has a 32-bit ID of the form @@ -87,7 +36,7 @@ enum Zorro_Classes { #define ZORRO_ID(manuf, prod, epc) \ ((ZORRO_MANUF_##manuf << 16) | ((prod) << 8) | (epc)) -typedef u32 zorro_id; +typedef __u32 zorro_id; #define ZORRO_MANUF_PACIFIC_PERIPHERALS 0x00D3 @@ -462,6 +411,9 @@ typedef u32 zorro_id; #define ZORRO_MANUF_ARMAX 0x0885 #define ZORRO_PROD_ARMAX_OMNIBUS ZORRO_ID(ARMAX, 0x00, 0) +#define ZORRO_MANUF_ZEUS 0x088D +#define ZORRO_PROD_ZEUS_SPIDER ZORRO_ID(ZEUS, 0x04, 0) + #define ZORRO_MANUF_NEWTEK 0x088F #define ZORRO_PROD_NEWTEK_VIDEOTOASTER ZORRO_ID(NEWTEK, 0x00, 0) @@ -558,6 +510,7 @@ typedef u32 zorro_id; #define ZORRO_PROD_PHASE5_CYBERVISION64_3D_PROTOTYPE ZORRO_ID(PHASE5, 0x32, 0) #define ZORRO_PROD_PHASE5_CYBERVISION64_3D ZORRO_ID(PHASE5, 0x43, 0) #define ZORRO_PROD_PHASE5_CYBERSTORM_MK_III ZORRO_ID(PHASE5, 0x64, 0) +#define ZORRO_PROD_PHASE5_BLIZZARD_603E_PLUS ZORRO_ID(PHASE5, 0x6e, 0) #define ZORRO_MANUF_DPS 0x2169 #define ZORRO_PROD_DPS_PERSONAL_ANIMATION_RECORDER ZORRO_ID(DPS, 0x01, 0) @@ -577,6 +530,9 @@ typedef u32 zorro_id; #define ZORRO_MANUF_UWE_GERLACH 0x3FF7 #define ZORRO_PROD_UWE_GERLACH_RAM_ROM ZORRO_ID(UWE_GERLACH, 0xd4, 0) +#define ZORRO_MANUF_ACT 0x4231 +#define ZORRO_PROD_ACT_PRELUDE ZORRO_ID(ACT, 0x01, 0) + #define ZORRO_MANUF_MACROSYSTEMS_GERMANY 0x4754 #define ZORRO_PROD_MACROSYSTEMS_MAESTRO ZORRO_ID(MACROSYSTEMS_GERMANY, 0x03, 0) #define ZORRO_PROD_MACROSYSTEMS_VLAB ZORRO_ID(MACROSYSTEMS_GERMANY, 0x04, 0) @@ -616,7 +572,6 @@ typedef u32 zorro_id; /* * Test and illegal Manufacturer IDs. - * These do NOT appear in arch/m68k/amiga/zorro.c! */ #define ZORRO_MANUF_HACKER 0x07DB @@ -631,7 +586,7 @@ typedef u32 zorro_id; /* * GVP identifies most of its products through the 'extended product code' - * (epc). The epc has to be and'ed with the GVP_PRODMASK before the + * (epc). The epc has to be ANDed with the GVP_PRODMASK before the * identification. */ @@ -652,25 +607,25 @@ enum GVP_flags { struct Node { struct Node *ln_Succ; /* Pointer to next (successor) */ struct Node *ln_Pred; /* Pointer to previous (predecessor) */ - u_char ln_Type; - char ln_Pri; /* Priority, for sorting */ - char *ln_Name; /* ID string, null terminated */ -}; + __u8 ln_Type; + __s8 ln_Pri; /* Priority, for sorting */ + __s8 *ln_Name; /* ID string, null terminated */ +} __attribute__ ((packed)); struct ExpansionRom { /* -First 16 bytes of the expansion ROM */ - u_char er_Type; /* Board type, size and flags */ - u_char er_Product; /* Product number, assigned by manufacturer */ - u_char er_Flags; /* Flags */ - u_char er_Reserved03; /* Must be zero ($ff inverted) */ - u_short er_Manufacturer;/* Unique ID,ASSIGNED BY COMMODORE-AMIGA! */ - u_long er_SerialNumber;/* Available for use by manufacturer */ - u_short er_InitDiagVec; /* Offset to optional "DiagArea" structure */ - u_char er_Reserved0c; - u_char er_Reserved0d; - u_char er_Reserved0e; - u_char er_Reserved0f; -}; + __u8 er_Type; /* Board type, size and flags */ + __u8 er_Product; /* Product number, assigned by manufacturer */ + __u8 er_Flags; /* Flags */ + __u8 er_Reserved03; /* Must be zero ($ff inverted) */ + __u16 er_Manufacturer; /* Unique ID, ASSIGNED BY COMMODORE-AMIGA! */ + __u32 er_SerialNumber; /* Available for use by manufacturer */ + __u16 er_InitDiagVec; /* Offset to optional "DiagArea" structure */ + __u8 er_Reserved0c; + __u8 er_Reserved0d; + __u8 er_Reserved0e; + __u8 er_Reserved0f; +} __attribute__ ((packed)); /* er_Type board type bits */ #define ERT_TYPEMASK 0xc0 @@ -683,17 +638,17 @@ struct ExpansionRom { struct ConfigDev { struct Node cd_Node; - u_char cd_Flags; /* (read/write) */ - u_char cd_Pad; /* reserved */ + __u8 cd_Flags; /* (read/write) */ + __u8 cd_Pad; /* reserved */ struct ExpansionRom cd_Rom; /* copy of board's expansion ROM */ void *cd_BoardAddr; /* where in memory the board was placed */ - u_long cd_BoardSize; /* size of board in bytes */ - u_short cd_SlotAddr; /* which slot number (PRIVATE) */ - u_short cd_SlotSize; /* number of slots (PRIVATE) */ + __u32 cd_BoardSize; /* size of board in bytes */ + __u16 cd_SlotAddr; /* which slot number (PRIVATE) */ + __u16 cd_SlotSize; /* number of slots (PRIVATE) */ void *cd_Driver; /* pointer to node of driver */ struct ConfigDev *cd_NextCD; /* linked list of drivers to config */ - u_long cd_Unused[4]; /* for whatever the driver wants */ -}; + __u32 cd_Unused[4]; /* for whatever the driver wants */ +} __attribute__ ((packed)); #else /* __ASSEMBLY__ */ @@ -738,7 +693,7 @@ CD_sizeof = CD_Unused+(4*4) #ifdef __KERNEL__ -extern unsigned int zorro_num_autocon; /* # of autoconfig devices found */ +extern unsigned int zorro_num_autocon; /* # of autoconfig devices found */ extern struct ConfigDev zorro_autocon[ZORRO_NUM_AUTO]; @@ -746,6 +701,9 @@ extern struct ConfigDev zorro_autocon[ZORRO_NUM_AUTO]; * Zorro Functions */ +extern void zorro_init(void); +extern void zorro_proc_init(void); + extern unsigned int zorro_find(zorro_id id, unsigned int part, unsigned int index); extern const struct ConfigDev *zorro_get_board(unsigned int key); extern void zorro_config_board(unsigned int key, unsigned int part); @@ -761,7 +719,7 @@ extern void zorro_unconfig_board(unsigned int key, unsigned int part); * the corresponding bits. */ -extern u32 zorro_unused_z2ram[4]; +extern __u32 zorro_unused_z2ram[4]; #define Z2RAM_START (0x00200000) #define Z2RAM_END (0x00a00000) @@ -771,13 +729,6 @@ extern u32 zorro_unused_z2ram[4]; #define Z2RAM_CHUNKSHIFT (16) - /* - * Verbose Board Identification - */ - -extern void zorro_identify(void); -extern int zorro_get_list(char *buffer); - #endif /* !__ASSEMBLY__ */ #endif /* __KERNEL__ */ diff --git a/include/net/ip.h b/include/net/ip.h index add85700b..63ef8b0a2 100644 --- a/include/net/ip.h +++ b/include/net/ip.h @@ -23,7 +23,6 @@ #define _IP_H -#include <linux/config.h> #include <linux/types.h> #include <linux/socket.h> #include <linux/ip.h> @@ -94,11 +93,6 @@ extern int ip_local_deliver(struct sk_buff *skb); extern int ip_mr_input(struct sk_buff *skb); extern int ip_output(struct sk_buff *skb); extern int ip_mc_output(struct sk_buff *skb); -#ifdef CONFIG_IP_ACCT -extern int ip_acct_output(struct sk_buff *skb); -#else -#define ip_acct_output dev_queue_xmit -#endif extern void ip_fragment(struct sk_buff *skb, int (*out)(struct sk_buff*)); extern int ip_do_nat(struct sk_buff *skb); extern void ip_send_check(struct iphdr *ip); diff --git a/include/net/ip6_fib.h b/include/net/ip6_fib.h index 6b355cc12..5bd90dde7 100644 --- a/include/net/ip6_fib.h +++ b/include/net/ip6_fib.h @@ -141,7 +141,9 @@ extern int fib6_del(struct rt6_info *rt); extern void inet6_rt_notify(int event, struct rt6_info *rt); -extern void fib6_run_gc(unsigned long dummy); +extern void fib6_run_gc(unsigned long dummy); + +extern void fib6_gc_cleanup(void); #endif #endif diff --git a/include/net/ip6_route.h b/include/net/ip6_route.h index 8fb0fbed7..8ca62a7ed 100644 --- a/include/net/ip6_route.h +++ b/include/net/ip6_route.h @@ -100,6 +100,7 @@ struct netlink_callback; extern int inet6_dump_fib(struct sk_buff *skb, struct netlink_callback *cb); extern int inet6_rtm_newroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg); extern int inet6_rtm_delroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg); +extern int inet6_rtm_getroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg); extern void rt6_ifdown(struct device *dev); diff --git a/include/net/ip_masq.h b/include/net/ip_masq.h index 65282bfcb..716eea2ef 100644 --- a/include/net/ip_masq.h +++ b/include/net/ip_masq.h @@ -258,9 +258,10 @@ extern atomic_t __ip_masq_lock; extern int ip_masq_get_debug_level(void); #ifndef CONFIG_IP_MASQ_NDEBUG -#define IP_MASQ_DEBUG(level, msg...) \ +#define IP_MASQ_DEBUG(level, msg...) do { \ if (level <= ip_masq_get_debug_level()) \ - printk(KERN_DEBUG "IP_MASQ:" ## msg) + printk(KERN_DEBUG "IP_MASQ:" ## msg); \ + } while (0) #else /* NO DEBUGGING at ALL */ #define IP_MASQ_DEBUG(level, msg...) do { } while (0) #endif diff --git a/include/net/ipv6.h b/include/net/ipv6.h index c3d2d5895..acf37b357 100644 --- a/include/net/ipv6.h +++ b/include/net/ipv6.h @@ -4,7 +4,7 @@ * Authors: * Pedro Roque <roque@di.fc.ul.pt> * - * $Id: ipv6.h,v 1.10 1998/04/30 16:24:14 freitag Exp $ + * $Id: ipv6.h,v 1.12 1998/07/15 05:05:02 davem Exp $ * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -118,6 +118,31 @@ struct frag_queue { __u8 *nhptr; }; +struct ipv6_tlvtype +{ + u8 type; + u8 len; +}; + +struct ip6_ra_chain +{ + struct ip6_ra_chain *next; + struct sock *sk; + int sel; + void (*destructor)(struct sock *); +}; + +extern struct ip6_ra_chain *ip6_ra_chain; + +extern int ip6_ra_control(struct sock *sk, int sel, + void (*destructor)(struct sock *)); + + +extern int ip6_call_ra_chain(struct sk_buff *skb, int sel); + +extern int ip6_dstopt_unknown(struct sk_buff *skb, + struct ipv6_tlvtype *hdr); + extern int ipv6_routing_header(struct sk_buff **skb, struct device *dev, __u8 *nhptr, @@ -266,11 +291,16 @@ extern int ipv6_getsockopt(struct sock *sk, int level, int optname, char *optval, int *optlen); +extern void ipv6_packet_init(void); -extern void ipv6_init(void); -extern void ipv6_cleanup(void); -#endif -#endif +extern void ipv6_netdev_notif_init(void); + +extern void ipv6_packet_cleanup(void); + +extern void ipv6_netdev_notif_cleanup(void); + +#endif /* __KERNEL__ */ +#endif /* _NET_IPV6_H */ diff --git a/include/net/ndisc.h b/include/net/ndisc.h index adaf76ef3..8ca371336 100644 --- a/include/net/ndisc.h +++ b/include/net/ndisc.h @@ -56,7 +56,8 @@ struct ra_msg { }; -extern void ndisc_init(struct net_proto_family *ops); +extern int ndisc_init(struct net_proto_family *ops); + extern void ndisc_cleanup(void); extern int ndisc_rcv(struct sk_buff *skb, @@ -91,7 +92,9 @@ struct rt6_info * dflt_rt_lookup(void); /* * IGMP */ -extern void igmp6_init(struct net_proto_family *ops); +extern int igmp6_init(struct net_proto_family *ops); + +extern void igmp6_cleanup(void); extern int igmp6_event_query(struct sk_buff *skb, struct icmp6hdr *hdr, diff --git a/include/net/netbeui.h b/include/net/netbeui.h deleted file mode 100644 index 417a27e2c..000000000 --- a/include/net/netbeui.h +++ /dev/null @@ -1,150 +0,0 @@ -/* - * NetBEUI data structures - */ - -#ifndef __NET_NETBEUI_H -#define __NET_NETBEUI_H - - -#define NB_NAME_LEN 16 - -/* - * Used to keep lists of netbeui sessions - */ - -struct nb_ses -{ - struct nb_ses *next; - struct nb_nam *name; - struct nb_link *parent; /* Owner link */ - struct sock *sk; -}; - -/* - * A netbeui link - */ - -struct nb_link -{ - struct llc llc; /* Must be first */ - u8 mac[6]; /* Mac address of remote */ - struct device *dev; /* Device we heard him on */ - struct nb_ses *sessions;/* Netbeui sessions on this LLC link */ - struct wait_queue *wait;/* Wait queue for this netbios LLC */ - int busy; /* Track the LLC busy state */ - int state; /* Link state */ -#define NETBEUI_OPEN 1 /* Up and going */ -#define NETBEUI_CONNWAIT 2 /* Waiting to come up */ -#define NETBEUI_DISCWAIT 3 /* Waiting to drop and recover */ -#define NETBEUI_DEADWAIT 4 /* Trying to die */ -}; - - -/* - * Netbios name defence list - */ - -struct nb_name -{ - struct nb_name *next; /* Chain */ - struct device *dev; /* Device */ - char name[NB_NAME_LEN]; /* Object Name */ - int state; /* Name State */ -#define NB_NAME_ACQUIRE 1 /* We are trying to get a name */ -#define NB_NAME_COLLIDE 2 /* Name collided - we failed */ -#define NB_OURS 3 /* We own the name */ -#define NB_NAME_OTHER 4 /* Name found - owned by other */ -#define NB_NAME_GET 5 /* Trying to allocate a name */ -#define NB_STATE 7 /* State bits */ -#define NB_NAME_GROUP 8 /* Group name bit */ - int ours; /* We own this name */ - int users; /* Number of nb_ses's to this name */ - struct timer_list timer; /* Our timer */ - int timer_mode; /* Timer mode */ -#define NB_TIMER_ACQUIRE 1 /* Expiry means we got our name */ -#define NB_TIMER_COLLIDE 2 /* Expire a collided record */ -#define NB_TIMER_DROP 3 /* Drop a learned record */ -}; - - -/* - * LLC link manager - */ - -extern struct nb_link *netbeui_find_link(u8 macaddr); -extern struct nb_link *netbeui_create_link(u8 macaddr); -extern int netbeui_destroy_link(u8 macaddr); - -/* - * Namespace manager - */ - -extern struct nb_name *netbeui_find_name(char *name); -extern struct nb_name *netbeui_add_name(char *name, int ours); -extern struct nb_name *netbeui_lookup_name(char *name); -extern int nb_delete_name(struct nb_name *name); - -/* - * NetBEUI Protocol items - */ - -#define ADD_GROUP_NAME_QUERY 0x00 -#define ADD_NAME_QUERY 0x01 -#define NAME_IN_CONFLICT 0x02 -#define STATUS_QUERY 0x03 -#define TERMINATE_TRACE 0x07 -#define DATAGRAM 0x08 -#define DATAGRAM_BROADCAST 0x09 -#define NAME_QUERY 0x0A -#define ADD_NAME_RESPONSE 0x0D -#define NAME_RECOGNIZED 0x0E -#define STATUS_RESPONSE 0x0F -#define TERMINATE_TRACE2 0x13 -#define DATA_ACK 0x14 -#define DATA_FIRST_MIDDLE 0x15 -#define DATA_ONLY_LAST 0x16 -#define SESSION_CONFIRM 0x17 -#define SESSION_END 0x18 -#define SESSION_INITIALIZE 0x19 -#define NO_RECEIVE 0x1A -#define RECEIVE_OUTSTANDING 0x1B -#define RECEIVE_CONTINUE 0x1C -#define SESSION_ALIVE 0x1F - -#define NB_TRANSMIT_COUNT 6 -#define NB_TRANSMIT_TIMEOUT (HZ/2) - -#define NB_DESCRIM_1 0xEF -#define NB_DESCRIM_2 0xFF - -struct nb_dgram_pkt -{ - __u16 length; - __u8 descrim1; - __u8 descrim2; - __u8 command; - __u8 option1; - __u16 option2; - __u16 tx_seq; - __u16 rx_seq; - __u8 dest[NB_NAME_LEN]; - __u8 src[NB_NAME_LEN]; -}; - -struct nb_sess_pkt -{ - __u16 length; - __u8 descrim1; - __u8 descrim2; - __u8 command; - __u8 option1; - __u16 option2; - __u16 tx_seq; - __u16 rx_seq; - __u8 dnum; - __u8 snum; -}; - -#define NO_SEQ 0 - -#endif diff --git a/include/net/p8022tr.h b/include/net/p8022tr.h deleted file mode 100644 index f4231ecee..000000000 --- a/include/net/p8022tr.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef _NET_P8022TR_H -#define _NET_P8022TR_H - -extern struct datalink_proto *register_8022tr_client(unsigned char type, int (*rcvfunc)(struct sk_buff *, struct device *, struct packet_type *)); -extern void unregister_8022tr_client(unsigned char type); - -#endif - diff --git a/include/net/p8022trcall.h b/include/net/p8022trcall.h deleted file mode 100644 index 3ce6f3cdb..000000000 --- a/include/net/p8022trcall.h +++ /dev/null @@ -1,3 +0,0 @@ -/* Separate to keep compilation of Space.c simpler */ -extern void p8022tr_proto_init(struct net_proto *); - diff --git a/include/net/sock.h b/include/net/sock.h index 29d7985be..ed05e12be 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -126,12 +126,6 @@ struct ipx_opt { unsigned char node[IPX_NODE_LEN]; #endif unsigned short type; -/* - * To handle asynchronous messages from the NetWare server, we have to - * know the connection this socket belongs to. - */ - struct ncp_server *ncp_server; - }; #endif @@ -454,6 +448,9 @@ struct sock { #if defined(CONFIG_IPX) || defined(CONFIG_IPX_MODULE) struct ipx_opt af_ipx; #endif +#if defined (CONFIG_DECNET) || defined(CONFIG_DECNET_MODULE) + struct dn_scp dn; +#endif #if defined (CONFIG_PACKET) || defined(CONFIG_PACKET_MODULE) struct packet_opt *af_packet; #endif @@ -462,19 +459,19 @@ struct sock { #endif #if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE) ax25_cb *ax25; +#endif #if defined(CONFIG_NETROM) || defined(CONFIG_NETROM_MODULE) nr_cb *nr; #endif #if defined(CONFIG_ROSE) || defined(CONFIG_ROSE_MODULE) rose_cb *rose; #endif -#endif -#if defined(CONFIG_DECNET) || defined(CONFIG_DECNET_MODULE) - dn_cb *dn; -#endif #ifdef CONFIG_NETLINK struct netlink_opt af_netlink; #endif +#if defined(CONFIG_ECONET) || defined(CONFIG_ECONET_MODULE) + struct econet_opt *af_econet; +#endif } protinfo; /* IP 'private area' or will be eventually. */ diff --git a/include/net/tcp.h b/include/net/tcp.h index ca1240b8a..225d40ad0 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -654,17 +654,24 @@ static __inline__ unsigned int tcp_current_mss(struct sock *sk) return mss_now; } -/* Compute the actual receive window we are currently advertising. */ +/* Compute the actual receive window we are currently advertising. + * Rcv_nxt can be after the window if our peer push more data + * than the offered window. + */ static __inline__ u32 tcp_receive_window(struct tcp_opt *tp) { - return tp->rcv_wup - (tp->rcv_nxt - tp->rcv_wnd); + s32 win = tp->rcv_wup + tp->rcv_wnd - tp->rcv_nxt; + + if (win < 0) + win = 0; + return (u32) win; } /* Choose a new window, without checks for shrinking, and without * scaling applied to the result. The caller does these things * if necessary. This is a "raw" window selection. */ -extern u32 __tcp_select_window(struct sock *sk); +extern u32 __tcp_select_window(struct sock *sk, u32 cur_win); /* Chose a new window to advertise, update state in tcp_opt for the * socket, and return result with RFC1323 scaling applied. The return @@ -674,8 +681,8 @@ extern u32 __tcp_select_window(struct sock *sk); extern __inline__ u16 tcp_select_window(struct sock *sk) { struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - u32 new_win = __tcp_select_window(sk); u32 cur_win = tcp_receive_window(tp); + u32 new_win = __tcp_select_window(sk, cur_win); /* Never shrink the offered window */ if(new_win < cur_win) @@ -694,8 +701,8 @@ extern __inline__ u16 tcp_select_window(struct sock *sk) extern __inline__ int tcp_raise_window(struct sock *sk) { struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - u32 new_win = __tcp_select_window(sk); u32 cur_win = tcp_receive_window(tp); + u32 new_win = __tcp_select_window(sk, cur_win); return (new_win && (new_win > (cur_win << 1))); } diff --git a/include/net/x25.h b/include/net/x25.h index a72bd0426..5ac507bd5 100644 --- a/include/net/x25.h +++ b/include/net/x25.h @@ -147,6 +147,7 @@ extern unsigned int x25_new_lci(struct x25_neigh *); extern struct sock *x25_find_socket(unsigned int, struct x25_neigh *); extern void x25_destroy_socket(struct sock *); extern int x25_rx_call_request(struct sk_buff *, struct x25_neigh *, unsigned int); +extern void x25_kill_by_neigh(struct x25_neigh *); #include <net/x25call.h> @@ -161,6 +162,7 @@ extern void x25_terminate_link(struct x25_neigh *); extern int x25_parse_facilities(struct sk_buff *, struct x25_facilities *); extern int x25_create_facilities(unsigned char *, struct x25_facilities *); extern int x25_negotiate_facilities(struct sk_buff *, struct sock *, struct x25_facilities *); +extern void x25_limit_facilities(struct x25_facilities *, struct x25_neigh *); /* x25_in.c */ extern int x25_process_rx_frame(struct sock *, struct sk_buff *); |