Commit 3a527c36 authored by Linus Torvalds's avatar Linus Torvalds

Import 1.3.4

parent 8c78000c
......@@ -807,6 +807,13 @@ S: 1 Laurie Court
S: Kanata, Ontario
S: CANADA K2L 1S2
N: Andrew Tridgell
E: Andrew.Tridgell@anu.edu.au
D: dosemu, networking, samba
S: 3 Ballow Crescent
S: MacGregor A.C.T
S: 2615 Australia
N: Theodore Ts'o
E: tytso@mit.edu
D: Random Linux hacker
......
VERSION = 1
PATCHLEVEL = 3
SUBLEVEL = 3
SUBLEVEL = 4
ARCH = i386
......
......@@ -504,23 +504,23 @@ sys_call_table:
.quad sys_umask, do_entSys, do_entSys, sys_getpgrp, sys_getpagesize
.quad do_entSys, osf_vfork, sys_newstat, sys_newlstat, do_entSys
.quad do_entSys, osf_mmap, do_entSys, sys_munmap, sys_mprotect
.quad sys_madvise, do_entSys, do_entSys, do_entSys, sys_getgroups
.quad sys_madvise, sys_vhangup, do_entSys, do_entSys, sys_getgroups
/* map BSD's setpgrp to sys_setpgid for binary compatibility: */
.quad sys_setgroups, do_entSys, sys_setpgid, sys_setitimer, do_entSys
.quad do_entSys, sys_getitimer, sys_gethostname, sys_sethostname, sys_getdtablesize
.quad sys_dup2, sys_newfstat, sys_fcntl, sys_select, do_entSys
.quad sys_fsync, sys_setpriority, sys_socket, do_entSys, do_entSys
/*100*/ .quad do_entSys, do_entSys, do_entSys, sys_sigreturn, sys_bind
.quad do_entSys, sys_listen, do_entSys, do_entSys, do_entSys
.quad sys_fsync, sys_setpriority, sys_socket, sys_connect, sys_accept
/*100*/ .quad sys_getpriority, sys_send, sys_recv, sys_sigreturn, sys_bind
.quad sys_setsockopt, sys_listen, do_entSys, do_entSys, do_entSys
.quad do_entSys, sys_sigsuspend, do_entSys, do_entSys, do_entSys
.quad do_entSys, sys_gettimeofday, sys_getrusage, do_entSys, do_entSys
.quad do_entSys, sys_gettimeofday, sys_getrusage, sys_getsockopt, do_entSys
.quad do_entSys, do_entSys, sys_settimeofday, sys_fchown, sys_fchmod
.quad do_entSys, sys_setreuid, sys_setregid, sys_rename, sys_truncate
.quad sys_ftruncate, do_entSys, sys_setgid, do_entSys, do_entSys
.quad do_entSys, sys_mkdir, sys_rmdir, sys_utimes, do_entSys
.quad do_entSys, do_entSys, do_entSys, do_entSys, sys_getrlimit
.quad sys_recvfrom, sys_setreuid, sys_setregid, sys_rename, sys_truncate
.quad sys_ftruncate, do_entSys, sys_setgid, sys_sendto, sys_shutdown
.quad sys_socketpair, sys_mkdir, sys_rmdir, sys_utimes, do_entSys
.quad do_entSys, sys_getpeername, do_entSys, do_entSys, sys_getrlimit
.quad sys_setrlimit, do_entSys, sys_setsid, do_entSys, do_entSys
/*150*/ .quad do_entSys, do_entSys, do_entSys, do_entSys, do_entSys
/*150*/ .quad sys_getsockname, do_entSys, do_entSys, do_entSys, do_entSys
.quad do_entSys, sys_sigaction, do_entSys, do_entSys, osf_getdirentries
.quad osf_statfs, osf_fstatfs, do_entSys, do_entSys, do_entSys
.quad osf_getdomainname, do_entSys, do_entSys, do_entSys, do_entSys
......@@ -538,7 +538,7 @@ sys_call_table:
.quad do_entSys, do_entSys, do_entSys, do_entSys, do_entSys
.quad do_entSys, do_entSys, do_entSys, do_entSys, do_entSys
.quad do_entSys, do_entSys, do_entSys, do_entSys, do_entSys
.quad do_entSys, do_entSys, do_entSys, do_entSys, do_entSys
.quad do_entSys, do_entSys, do_entSys, do_entSys, osf_proplist_syscall
.quad do_entSys, do_entSys, do_entSys, do_entSys, do_entSys
/*250*/ .quad do_entSys, osf_usleep_thread, do_entSys, do_entSys, do_entSys
.quad do_entSys, do_entSys, do_entSys, do_entSys, do_entSys
......@@ -552,4 +552,4 @@ sys_call_table:
.quad do_entSys, do_entSys, do_entSys, do_entSys, do_entSys
/* linux-specific system calls start at 300 */
/*300*/ .quad sys_bdflush, sys_sethae, sys_mount, sys_adjtimex, sys_swapoff
.quad do_entSys, do_entSys, do_entSys, do_entSys, do_entSys
.quad sys_getdents, sys_create_module, sys_init_module, sys_delete_module, sys_get_kernel_syms
......@@ -68,7 +68,7 @@ struct osf_dirent_callback {
int error;
};
static int osf_filldir(void * __buf, char * name, int namlen, off_t offset, ino_t ino)
static int osf_filldir(void * __buf, const char * name, int namlen, off_t offset, ino_t ino)
{
struct osf_dirent * dirent;
struct osf_dirent_callback * buf = (struct osf_dirent_callback *) __buf;
......@@ -509,3 +509,124 @@ asmlinkage long osf_shmat(int shmid, void *shmaddr, int shmflg)
*/
return raddr;
}
/*
* The following stuff should move into a header file should it ever
* be labeled "officially supported." Right now, there is just enough
* support to avoid applications (such as tar) printing error
* messages. The attributes are not really implemented.
*/
/*
* Values for Property list entry flag
*/
#define PLE_PROPAGATE_ON_COPY 0x1 /* cp(1) will copy entry
by default */
#define PLE_FLAG_MASK 0x1 /* Valid flag values */
#define PLE_FLAG_ALL -1 /* All flag value */
struct proplistname_args {
unsigned int pl_mask;
unsigned int pl_numnames;
char **pl_names;
};
union pl_args {
struct setargs {
char *path;
long follow;
long nbytes;
char *buf;
} set;
struct fsetargs {
long fd;
long nbytes;
char *buf;
} fset;
struct getargs {
char *path;
long follow;
struct proplistname_args *name_args;
long nbytes;
char *buf;
int *min_buf_size;
} get;
struct fgetargs {
long fd;
struct proplistname_args *name_args;
long nbytes;
char *buf;
int *min_buf_size;
} fget;
struct delargs {
char *path;
long follow;
struct proplistname_args *name_args;
} del;
struct fdelargs {
long fd;
struct proplistname_args *name_args;
} fdel;
};
enum pl_code {
PL_SET = 1, PL_FSET = 2,
PL_GET = 3, PL_FGET = 4,
PL_DEL = 5, PL_FDEL = 6
};
asmlinkage long osf_proplist_syscall (enum pl_code code, union pl_args *args)
{
long error;
int *min_buf_size_ptr;
switch (code) {
case PL_SET:
error = verify_area(VERIFY_READ, &args->set.nbytes,
sizeof(args->set.nbytes));
if (error)
return error;
return args->set.nbytes;
case PL_FSET:
error = verify_area(VERIFY_READ, &args->fset.nbytes,
sizeof(args->fset.nbytes));
if (error)
return error;
return args->fset.nbytes;
case PL_GET:
error = verify_area(VERIFY_READ, &args->get.min_buf_size,
sizeof(args->get.min_buf_size));
if (error)
return error;
min_buf_size_ptr = get_user(&args->get.min_buf_size);
error = verify_area(VERIFY_WRITE, min_buf_size_ptr,
sizeof(*min_buf_size_ptr));
if (error)
return error;
put_user(0, min_buf_size_ptr);
return 0;
case PL_FGET:
error = verify_area(VERIFY_READ, &args->fget.min_buf_size,
sizeof(args->fget.min_buf_size));
if (error)
return error;
min_buf_size_ptr = get_user(&args->fget.min_buf_size);
error = verify_area(VERIFY_WRITE, min_buf_size_ptr,
sizeof(*min_buf_size_ptr));
if (error)
return error;
put_user(0, min_buf_size_ptr);
return 0;
case PL_DEL:
case PL_FDEL:
return 0;
default:
return -EOPNOTSUPP;
}
}
......@@ -35,7 +35,7 @@ struct hae hae = {
struct hwrpb_struct *hwrpb;
unsigned char aux_device_present;
unsigned char aux_device_present = 0xaa;
/*
* This is setup by the secondary bootstrap loader. Because
......@@ -52,7 +52,7 @@ static char command_line[COMMAND_LINE_SIZE] = { 0, };
/*
* The format of "screen_info" is strange, and due to early
* i386-setup code. This is just enough to make the console
* code think we're on a EGA+ colour display.
* code think we're on a VGA color display.
*/
struct screen_info screen_info = {
0, 0, /* orig-x, orig-y */
......@@ -62,6 +62,7 @@ struct screen_info screen_info = {
80, /* orig-video-cols */
0,0,0, /* ega_ax, ega_bx, ega_cx */
25, /* orig-video-lines */
1, /* orig-video-isVGA */
16 /* orig-video-points */
};
......@@ -95,7 +96,6 @@ void setup_arch(char **cmdline_p,
set_hae(hae.cache); /* sync HAE register w/hae_cache */
ROOT_DEV = 0x0802; /* sda2 */
aux_device_present = 0xaa;
command_line[COMMAND_LINE_SIZE - 1] = '\0';
strcpy(command_line, COMMAND_LINE);
......
......@@ -92,7 +92,9 @@ comment 'SCSI low-level drivers'
bool 'Adaptec AHA152X support' CONFIG_SCSI_AHA152X y
bool 'Adaptec AHA1542 support' CONFIG_SCSI_AHA1542 n
bool 'Adaptec AHA1740 support' CONFIG_SCSI_AHA1740 y
bool 'Adaptec AHA274X/284X support' CONFIG_SCSI_AHA274X n
if [ "$CONFIG_PCI" = "y" ]; then
bool 'Adaptec AHA274X/284X/294X support' CONFIG_SCSI_AIC7XXX n
fi
bool 'BusLogic SCSI support' CONFIG_SCSI_BUSLOGIC n
bool 'EATA-DMA (DPT,NEC&ATT for ISA,EISA,PCI) support' CONFIG_SCSI_EATA_DMA n
bool 'UltraStor 14F/34F support' CONFIG_SCSI_U14_34F n
......@@ -163,7 +165,7 @@ if [ "$CONFIG_NET_ISA" = "y" ]; then
bool 'EtherWorks 3 support' CONFIG_EWRK3 n
if [ "$CONFIG_NET_ALPHA" = "y" ]; then
bool 'AT1700 support' CONFIG_AT1700 n
# bool 'EtherExpressPro support' CONFIG_EEXPRESS_PRO n
bool 'EtherExpressPro support' CONFIG_EEXPRESS_PRO n
bool 'EtherExpress support' CONFIG_EEXPRESS n
bool 'NI5210 support' CONFIG_NI52 n
bool 'NI6510 support' CONFIG_NI65 n
......@@ -230,8 +232,7 @@ bool 'Second extended fs support' CONFIG_EXT2_FS y
bool 'xiafs filesystem support' CONFIG_XIA_FS n
bool 'msdos fs support' CONFIG_MSDOS_FS y
if [ "$CONFIG_MSDOS_FS" = "y" ]; then
#bool 'umsdos: Unix like fs on top of std MSDOS FAT fs' CONFIG_UMSDOS_FS n
comment 'Umsdos is not supported in 1.3.0: wait for 1.3.1'
bool 'umsdos: Unix like fs on top of std MSDOS FAT fs' CONFIG_UMSDOS_FS n
fi
bool '/proc filesystem support' CONFIG_PROC_FS y
if [ "$CONFIG_INET" = "y" ]; then
......
......@@ -482,7 +482,7 @@ static int load_elf_binary(struct linux_binprm * bprm, struct pt_regs * regs)
elf_ppnt->p_offset & 0xfffff000);
#ifdef LOW_ELF_STACK
if(elf_ppnt->p_vaddr & 0xfffff000 < elf_stack)
if((elf_ppnt->p_vaddr & 0xfffff000) < elf_stack)
elf_stack = elf_ppnt->p_vaddr & 0xfffff000;
#endif
......@@ -635,7 +635,7 @@ static int load_elf_library(int fd){
if(k > elf_bss) elf_bss = k;
sys_close(fd);
if (error != elf_phdata->p_vaddr & 0xfffff000) {
if (error != (elf_phdata->p_vaddr & 0xfffff000)) {
kfree(elf_phdata);
return error;
}
......
......@@ -490,7 +490,7 @@ _sys_call_table:
.long _sys_swapon
.long _sys_reboot
.long _old_readdir
.long _sys_mmap /* 90 */
.long _old_mmap /* 90 */
.long _sys_munmap
.long _sys_truncate
.long _sys_ftruncate
......@@ -544,4 +544,4 @@ _sys_call_table:
.long _sys_getdents
.long _sys_select
.long _sys_flock
.space (NR_syscalls-140)*4
.space (NR_syscalls-143)*4
......@@ -14,7 +14,6 @@
.globl _empty_bad_page
.globl _empty_bad_page_table
.globl _empty_zero_page
.globl _floppy_track_buffer
#define __ASSEMBLY__
#include <linux/tasks.h>
......@@ -288,15 +287,7 @@ _empty_bad_page_table:
_empty_zero_page:
.org 0x6000
/*
* floppy_track_buffer is used to buffer one track of floppy data: it
* has to be separate from the tmp_floppy area, as otherwise a single-
* sector read/write can mess it up. It can contain one full cylinder (sic) of
* data (36*2*512 bytes).
*/
_floppy_track_buffer:
.fill 512*2*MAX_BUFFER_SECTORS,1,0
stack_start:
.long _init_user_stack+4096
.long KERNEL_DS
......
......@@ -39,22 +39,6 @@ void enable_hlt(void)
hlt_counter--;
}
asmlinkage int sys_pipe(unsigned long * fildes)
{
int fd[2];
int error;
error = verify_area(VERIFY_WRITE,fildes,8);
if (error)
return error;
error = do_pipe(fd);
if (error)
return error;
put_fs_long(fd[0],0+fildes);
put_fs_long(fd[1],1+fildes);
return 0;
}
/*
* The idle loop on a i386..
*/
......
......@@ -14,15 +14,56 @@
#include <linux/msg.h>
#include <linux/shm.h>
#include <linux/stat.h>
#include <linux/mman.h>
#include <asm/segment.h>
/*
* Perform the select(nd, in, out, ex, tv) system call.
* Linux/i386 didn't use to be able to handle 5 system call
* parameters, so the old select used a memory block for
* parameter passing..
* sys_pipe() is the normal C calling standard for creating
* a pipe. It's not the way unix tranditionally does this, though.
*/
asmlinkage int sys_pipe(unsigned long * fildes)
{
int fd[2];
int error;
error = verify_area(VERIFY_WRITE,fildes,8);
if (error)
return error;
error = do_pipe(fd);
if (error)
return error;
put_fs_long(fd[0],0+fildes);
put_fs_long(fd[1],1+fildes);
return 0;
}
/*
* Perform the select(nd, in, out, ex, tv) and mmap() system
* calls. Linux/i386 didn't use to be able to handle more than
* 4 system call parameters, so these system calls used a memory
* block for parameter passing..
*/
asmlinkage int old_mmap(unsigned long *buffer)
{
int error;
unsigned long flags;
struct file * file = NULL;
error = verify_area(VERIFY_READ, buffer, 6*sizeof(long));
if (error)
return error;
flags = get_user(buffer+3);
if (!(flags & MAP_ANONYMOUS)) {
unsigned long fd = get_user(buffer+4);
if (fd >= NR_OPEN || !(file = current->files->fd[fd]))
return -EBADF;
}
return do_mmap(file, get_user(buffer), get_user(buffer+1),
get_user(buffer+2), flags, get_user(buffer+5));
}
extern asmlinkage int sys_select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
asmlinkage int old_select(unsigned long *buffer)
......
......@@ -82,7 +82,7 @@ void die_if_kernel(char * str, struct pt_regs * regs, long err)
unsigned long *stack, addr, module_start, module_end;
extern char start_kernel, etext;
if (regs->cp0_status & (ST0_ERL|ST0_EXL) == 0)
if ((regs->cp0_status & (ST0_ERL|ST0_EXL)) == 0)
return;
sp = (unsigned long *)regs->reg29;
......
......@@ -19,15 +19,25 @@ SHELL =/bin/bash
# I ignore it and eliminate those mappings during vm initialization and
# just leave the low mapping.
#
LINKFLAGS = -N -Ttext 0x00004000
LINKFLAGS = -N -Ttext 0xf0004000
CFLAGS := $(CFLAGS) -pipe
HEAD := arch/sparc/kernel/head.o
SUBDIRS := $(SUBDIRS) arch/sparc/kernel arch/sparc/lib arch/sparc/mm
SUBDIRS := $(SUBDIRS) arch/sparc/kernel arch/sparc/lib arch/sparc/mm \
arch/sparc/prom
ARCHIVES := arch/sparc/kernel/kernel.o arch/sparc/mm/mm.o $(ARCHIVES)
LIBS := $(TOPDIR)/lib/lib.a $(LIBS) $(TOPDIR)/arch/sparc/lib/lib.a
aoutimage: vmlinux
elftoaout -o aoutimage vmlinux
LIBS := $(TOPDIR)/lib/lib.a $(LIBS) $(TOPDIR)/arch/sparc/lib/lib.a \
$(TOPDIR)/arch/sparc/prom/promlib.a
archclean:
rm -f $(TOPDIR)/arch/sparc/boot/boot
archdep:
# Makefile for the Sparc low level /boot module.
#
# Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
OBJS =bare.o init_me.o ../kernel/promops.o ../lib/lib.a
BOOTLINKFLAGS = -N -Ttext 0x200000 -e _first_adr_in_text
.c.s:
$(CC) $(CFLAGS) -S -o $*.s $<
.s.o:
$(AS) -o $*.o $<
.c.o:
$(CC) $(CFLAGS) -c -o $*.o $<
.S.s:
$(CC) -D__ASSEMBLY__ -D__KERNEL__ -ansi -E -o $*.o $<
.S.o:
$(CC) -D__ASSEMBLY__ -D__KERNEL__ -ansi -c -o $*.o $<
all: boot
boot: $(OBJS)
$(LD) $(BOOTLINKFLAGS) $(OBJS) -o boot
dep:
$(CPP) -M *.c > .depend
$(CPP) -M -D__ASSEMBLY__ -ansi *.S >>.depend
dummy:
#
# include a dependency file if one exists
#
ifeq (.depend,$(wildcard .depend))
include .depend
endif
This directory will contain the code necessary to compile and link the
/boot program which is necessary to boot on the Sparc. This program
is real ugly and it knows too much. It must be able to not only boot
off of the root partition but also be able to netboot. This means
that it knows about RPC and NFS (bleech, yuck, eeewwwww!!) so that it
can remote mount the root directory to fetch the kernel. Also it must
be able to ARP for it's IP address and who it's boot server is. I
think I'm getting sick.
Regardless for now I will concentrate on the low-level stuff necessary
to get the thing going. This means the low-level entry code, etc.
The prom knows how to get "us" if we have the proper boot blocks,
actually the boot blocks live in our logical partition on a hard drive
whereas over NFS this isn't applicable. We have the boot blocks in
our data area either way because we can be dual purpose.
More will come....
Hopefully I can write this such that it will work on almost all SUN
machines in existance. We'll see ;(
/* base.S: Ugly low-level boot program entry code. The job of this
* module is to parse the boot flags, try to mount the remote
* root filesystem and load the kernel into virtual memory.
*
* Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
*/
#include "bare.h"
.data
.globl C_LABEL(romvec)
.globl C_LABEL(idp_ptr)
C_LABEL(romvec):
.word 0
C_LABEL(idp_ptr):
.word 0
.text
.align 8
.globl C_LABEL(first_adr_in_text)
C_LABEL(first_adr_in_text):
/* Grrr, boot block, scratching my head... */
.globl C_LABEL(b_block) /* Start of actual boot block */
.globl C_LABEL(b_block_size) /* In bytes */
.globl C_LABEL(b_block_cksum) /* Checksum of boot block bytes */
b start_of_execution /* XXX Hack */
nop
.align 8
C_LABEL(b_block):
.skip (BOOTBLOCK_NENTRIES * BOOTBLOCK_ENTSIZE)
C_LABEL(b_block_size):
.word 0
C_LABEL(b_block_cksum):
.word 0
/* Ok, the prom has left in %o0 the PROM pointer. We leave it here
* for when we jump into the kernel. So save out of this window before
* you dick with %o0. As far as I know we could be loaded *anywhere*, so
* we relocate ourselves to the "linked" location. Self modifying code rules.
*/
start_of_execution:
sethi %hi(C_LABEL(first_adr_in_text)), %o1 ! This is our top
or %o1, %lo(C_LABEL(first_adr_in_text)), %o1 ! of stack too.
sub %o1, C_STACK, %o1
add %o1, 0x7, %o1
andn %o1, 0x7, %o1
save %o1, 0x0, %sp ! save is an add
here:
call there
sethi %hi(here), %o4
there:
sub %o7, here-C_LABEL(first_adr_in_text), %o5
or %o4, %lo(here), %o4
cmp %o4, %o7
be loaded_ok
nop
/* Gotta relocate, compute our size sans bss segment. */
set C_LABEL(edata)+4, %o3
set C_LABEL(first_adr_in_text), %o2
sub %o3, %o2, %o3
rel_loop:
ld [%o5], %o4
add %o5, 0x4, %o5
st %o4, [%o2]
subcc %o3, 0x4, %o3
bg rel_loop
add %o2, 0x4, %o2
/* Pray that we are now in a sane place in memory */
sethi %hi(loaded_ok), %o2
or %o2, %lo(loaded_ok), %o2
jmp %o2
nop
loaded_ok:
/* Save the PROM pointer */
sethi %hi(C_LABEL(romvec)), %o1
or %o1, %lo(C_LABEL(romvec)), %o1
st %i0, [%o1]
/* Build a PSR we can live with */
rd %psr, %o1
#if 0
andn %o1, PSR_PIL, %o1
sethi %hi(SANE_PSR), %g4
or %g4, %lo(SANE_PSR), %g4
or %o1, %g4, %o1
#endif
/* V8 book says this works to calculate num_windows */
sethi %hi(0xffffffff), %g2
rd %wim, %g3
or %g2, %lo(0xffffffff), %g2
wr %g2, 0x0, %wim
WRITE_PAUSE
rd %wim, %g4
WRITE_PAUSE
wr %g3, 0x0, %wim
WRITE_PAUSE
/* Restore old %psr */
wr %o1, 0x0, %psr
WRITE_PAUSE
or %g0, 0x0, %g3
1:
srl %g4, 0x1, %g4
subcc %g4, 0x0, %g0
bne 1b
add %g3, 0x1, %g3
/* %g3 now contains nwindows */
sethi %hi(C_LABEL(nwindows)), %o4
st %g3, [%o4 + %lo(C_LABEL(nwindows))]
/* Now zero out our bss segment, lord knows the nasty prom monster
* didn't do it for us.
*/
sethi %hi(C_LABEL(end)), %g1
or %g1, %lo(C_LABEL(end)), %g1
add %g1, 0x4, %g1
sethi %hi(C_LABEL(edata)), %g2
or %g2, %lo(C_LABEL(edata)), %g2
/* Slow, inefficient, who cares, this is messy boot code */
bzero_bss_loop:
st %g0, [%g2]
add %g2, 0x4, %g2
cmp %g2, %g1
bl bzero_bss_loop
nop
call C_LABEL(init_me) ! Fun with imperical constants and prom
nop
/* Dump back into the prom */
get_me_out_of_here:
set C_LABEL(romvec), %g2
ld [%g2], %g2
ld [%g2 + 0x74], %g2
restore
call %g2
nop
/* bare.h: Defines for the low level entry code of the BOOT program.
* We include in the head.h stuff that the real kernel uses
* and this saves a lot of repetition here.
*
* Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
*/
#include <asm/head.h>
#include <asm/psr.h>
#include <asm/cprefix.h>
#define SANE_PIL (0xd00) /* No interrupts except clock and unmaskable NMI's */
#define SANE_PSR (SANE_PIL|PSR_S|PSR_ET)
#define BOOTBLOCK_NENTRIES 0x40 /* Number of entries in the boot block */
#define BOOTBLOCK_ENTSIZE 0x04 /* Size in bytes of each boot block entry */
/* imperical.h: Nasty hacks....
*
* Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
*/
#define DEF_BOGO 25
/* init_me.c: Initialize imperical constants and gather some info from
* the boot prom.
*
* Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
*/
#include <asm/openprom.h> /* For property declarations and the prom structs */
#include <asm/oplib.h>
#include <asm/vac-ops.h>
#include "imperical.h" /* Don't ask... */
#define DEBUG_INIT_ME /* Tell me whats goin on */
unsigned int nwindows; /* Set in bare.S */
unsigned int nwindowsm1;
unsigned int pac_or_vac; /* 0 means "dunno" 1 means "VAC" 2 means "PAC" */
unsigned int pvac_size; /* Use the same two variables for a PAC and VAC */
unsigned int pvac_linesize;
unsigned int pac_size;
int num_segmaps;
int num_contexts;
unsigned int BOGOMIPS; /* bogosity without the VAC cache on */
unsigned int BOGOMIPS_WCACHE; /* bogosity with the VAC cache */
unsigned int delay_factor;
extern int prom_node_root;
void (*printk)(const char *str, ...);
void init_me(void)
{
unsigned int grrr;
printk = romvec->pv_printf;
prom_node_root = prom_nextnode(0);
prom_getprop(prom_node_root, "mmu-npmg", &num_segmaps,
sizeof(unsigned int));
pvac_size = prom_getint_default(prom_node_root, "vac-size", 65536);
pvac_linesize = prom_getint_default(prom_node_root, "vac-linesize", 16);
grrr = prom_getint_default(prom_node_root, "mips-on", 0);
if(!grrr) {
grrr = prom_getint_default(prom_node_root, "clock-frequency", 0);
if(grrr > 15000000 && grrr < 100000000) {
BOGOMIPS = 3;
BOGOMIPS_WCACHE = grrr / 1000000;
} else {
BOGOMIPS = DEF_BOGO;
BOGOMIPS_WCACHE = DEF_BOGO;
}
} else (BOGOMIPS_WCACHE = grrr,
BOGOMIPS = prom_getint(prom_node_root, "mips-off"));
#ifdef DEBUG_INIT_ME
(*(romvec->pv_printf))("\nBOGOMIPS %d\n", (int) BOGOMIPS);
(*(romvec->pv_printf))("BOGOMIPS_WCACHE %d\n", (int) BOGOMIPS_WCACHE);
(*(romvec->pv_printf))("pvac_size %d\n", (int) pvac_size);
(*(romvec->pv_printf))("pvac_linesize %d\n", (int) pvac_linesize);
(*(romvec->pv_printf))("num_segmaps %d\n", (int) num_segmaps);
#endif
delay_factor = (BOGOMIPS > 3) ? ((BOGOMIPS - 2) >> 1) : 11;
(*(romvec->pv_printf))("\nLILO: \n");
return;
}
......@@ -9,12 +9,12 @@
# see the Configure script.
#
echo "#define CONFIG_SPARCDEVS 1" >> $CONFIG_H
echo "CONFIG_SPARCDEVS=y" >> $CONFIG
comment 'Sparc Kernel setup'
bool 'Sparc V8 kernel' CONFIG_SPARC_V8 y
bool 'Sparc SMP support' CONFIG_LINUX_SMP n
bool 'Sparc SUN4M support' CONFIG_SUN4M n
bool 'Sparc Reference MMU' CONFIG_SRMMU n
bool 'Sun floppy controller support' CONFIG_BLK_DEV_SUNFD n
bool 'Networking support' CONFIG_NET n
bool 'Limit memory to low 16MB' CONFIG_MAX_16M n
bool 'System V IPC' CONFIG_SYSVIPC y
......@@ -57,26 +57,8 @@ bool 'SCSI generic support' CONFIG_CHR_DEV_SG n
comment 'SCSI low-level drivers'
bool 'Adaptec AHA152X support' CONFIG_SCSI_AHA152X n
bool 'Adaptec AHA1542 support' CONFIG_SCSI_AHA1542 y
bool 'Adaptec AHA1740 support' CONFIG_SCSI_AHA1740 n
bool 'Adaptec AHA274X/284X support' CONFIG_SCSI_AHA274X n
bool 'BusLogic SCSI support' CONFIG_SCSI_BUSLOGIC n
bool 'UltraStor 14F/34F support' CONFIG_SCSI_U14_34F n
bool 'Future Domain 16xx SCSI support' CONFIG_SCSI_FUTURE_DOMAIN n
bool 'Generic NCR5380 SCSI support' CONFIG_SCSI_GENERIC_NCR5380 n
if [ "$CONFIG_PCI" = "y" ]; then
bool 'NCR53c7,8xx SCSI support' CONFIG_SCSI_NCR53C7xx n
fi
bool 'Always IN2000 SCSI support (test release)' CONFIG_SCSI_IN2000 n
bool 'PAS16 SCSI support' CONFIG_SCSI_PAS16 n
bool 'QLOGIC SCSI support' CONFIG_SCSI_QLOGIC n
bool 'Seagate ST-02 and Future Domain TMC-8xx SCSI support' CONFIG_SCSI_SEAGATE n
bool 'Trantor T128/T128F/T228 SCSI support' CONFIG_SCSI_T128 n
bool 'UltraStor SCSI support' CONFIG_SCSI_ULTRASTOR n
bool '7000FASST SCSI support' CONFIG_SCSI_7000FASST n
bool 'EATA ISA/EISA (DPT PM2011/021/012/022/122/322) support' CONFIG_SCSI_EATA n
#bool 'SCSI debugging host adapter' CONFIG_SCSI_DEBUG n
bool 'Sun ESP Scsi support' CONFIG_SCSI_SUN_ESP n
fi
......@@ -100,143 +82,42 @@ fi
bool 'PPP (point-to-point) support' CONFIG_PPP n
bool 'PLIP (parallel port) support' CONFIG_PLIP n
bool 'Load balancing support (experimental)' CONFIG_SLAVE_BALANCING n
bool 'Do you want to be offered ALPHA test drivers' CONFIG_NET_ALPHA n
bool 'Western Digital/SMC cards' CONFIG_NET_VENDOR_SMC n
if [ "$CONFIG_NET_VENDOR_SMC" = "y" ]; then
bool 'WD80*3 support' CONFIG_WD80x3 n
bool 'SMC Ultra support' CONFIG_ULTRA n
fi
bool 'AMD LANCE and PCnet (AT1500 and NE2100) support' CONFIG_LANCE n
bool '3COM cards' CONFIG_NET_VENDOR_3COM y
if [ "$CONFIG_NET_VENDOR_3COM" = "y" ]; then
bool '3c501 support' CONFIG_EL1 n
bool '3c503 support' CONFIG_EL2 n
if [ "$CONFIG_NET_ALPHA" = "y" ]; then
bool '3c505 support' CONFIG_ELPLUS n
bool '3c507 support' CONFIG_EL16 n
fi
bool '3c509/3c579 support' CONFIG_EL3 y
fi
bool 'Other ISA cards' CONFIG_NET_ISA n
if [ "$CONFIG_NET_ISA" = "y" ]; then
bool 'Cabletron E21xx support' CONFIG_E2100 n
bool 'DEPCA support' CONFIG_DEPCA n
bool 'EtherWorks 3 support' CONFIG_EWRK3 n
if [ "$CONFIG_NET_ALPHA" = "y" ]; then
# bool 'Arcnet support' CONFIG_ARCNET n
bool 'AT1700 support' CONFIG_AT1700 n
# bool 'EtherExpressPro support' CONFIG_EEXPRESS_PRO n
bool 'EtherExpress support' CONFIG_EEXPRESS n
bool 'NI5210 support' CONFIG_NI52 n
bool 'NI6510 support' CONFIG_NI65 n
fi
bool 'HP PCLAN+ (27247B and 27252A) support' CONFIG_HPLAN_PLUS n
bool 'HP PCLAN (27245 and other 27xxx series) support' CONFIG_HPLAN n
bool 'NE2000/NE1000 support' CONFIG_NE2000 y
bool 'SK_G16 support' CONFIG_SK_G16 n
fi
bool 'EISA, VLB, PCI and on board controllers' CONFIG_NET_EISA n
if [ "$CONFIG_NET_EISA" = "y" ]; then
if [ "$CONFIG_NET_ALPHA" = "y" ]; then
bool 'Ansel Communications EISA 3200 support' CONFIG_AC3200 n
fi
bool 'Apricot Xen-II on board ethernet' CONFIG_APRICOT n
# bool 'DEC 21040 PCI support' CONFIG_DEC_ELCP n
# bool 'LPL T100V 100Mbs support' CONFIG_LPL_T100 n
# bool 'PCnet32 (32 bit VLB and PCI LANCE) support' CONFIG_PCNET32 n
bool 'Zenith Z-Note support' CONFIG_ZNET y
bool 'Sun LANCE Ethernet support' CONFIG_SUN_LANCE n
bool 'Sun Intel Ethernet support' CONFIG_SUN_INTEL n
fi
bool 'Pocket and portable adaptors' CONFIG_NET_POCKET n
if [ "$CONFIG_NET_POCKET" = "y" ]; then
bool 'AT-LAN-TEC/RealTek pocket adaptor support' CONFIG_ATP n
bool 'D-Link DE600 pocket adaptor support' CONFIG_DE600 n
bool 'D-Link DE620 pocket adaptor support' CONFIG_DE620 n
# bool 'Silicom pocket adaptor support' CONFIG_SILICOM_PEA n
# bool 'WaveLAN PCMCIA support' CONFIG_WaveLAN n
# bool '3 Com 3c589 PCMCIA support' CONFIG_3C589 n
fi
fi
fi
comment 'CD-ROM drivers (not for SCSI or IDE/ATAPI drives)'
bool 'Sony CDU31A/CDU33A CDROM driver support' CONFIG_CDU31A n
bool 'Mitsumi (not IDE/ATAPI) CDROM driver support' CONFIG_MCD n
bool 'Matsushita/Panasonic CDROM driver support' CONFIG_SBPCD n
if [ "$CONFIG_SBPCD" = "y" ]; then
bool 'Matsushita/Panasonic second CDROM controller support' CONFIG_SBPCD2 n
if [ "$CONFIG_SBPCD2" = "y" ]; then
bool 'Matsushita/Panasonic third CDROM controller support' CONFIG_SBPCD3 n
if [ "$CONFIG_SBPCD3" = "y" ]; then
bool 'Matsushita/Panasonic fourth CDROM controller support' CONFIG_SBPCD4 n
fi
fi
fi
bool 'Aztech/Orchid/Okano/Wearnes (non IDE) CDROM support' CONFIG_AZTCD n
comment 'Filesystems'
bool 'Standard (minix) fs support' CONFIG_MINIX_FS y
bool 'Extended fs support' CONFIG_EXT_FS y
bool 'Standard (minix) fs support' CONFIG_MINIX_FS n
bool 'Extended fs support' CONFIG_EXT_FS n
bool 'Second extended fs support' CONFIG_EXT2_FS y
bool 'xiafs filesystem support' CONFIG_XIA_FS y
bool 'msdos fs support' CONFIG_MSDOS_FS y
if [ "$CONFIG_MSDOS_FS" = "y" ]; then
bool 'umsdos: Unix like fs on top of std MSDOS FAT fs' CONFIG_UMSDOS_FS n
fi
bool 'xiafs filesystem support' CONFIG_XIA_FS n
bool 'msdos fs support' CONFIG_MSDOS_FS n
bool '/proc filesystem support' CONFIG_PROC_FS n
if [ "$CONFIG_INET" = "y" ]; then
bool 'NFS filesystem support' CONFIG_NFS_FS n
fi
if [ "$CONFIG_BLK_DEV_SR" = "y" -o "$CONFIG_CDU31A" = "y" -o "$CONFIG_MCD" = "y" -o "$CONFIG_SBPCD" = "y" -o "$CONFIG_BLK_DEV_IDECD" = "y" ]; then
bool 'ISO9660 cdrom filesystem support' CONFIG_ISO9660_FS y
bool 'ISO9660 cdrom filesystem support' CONFIG_ISO9660_FS n
else
bool 'ISO9660 cdrom filesystem support' CONFIG_ISO9660_FS n
fi
bool 'OS/2 HPFS filesystem support (read only)' CONFIG_HPFS_FS n
bool 'System V and Coherent filesystem support' CONFIG_SYSV_FS y
bool 'System V and Coherent filesystem support' CONFIG_SYSV_FS n
comment 'character devices'
bool 'Cyclades async mux support' CONFIG_CYCLADES n
bool 'Parallel printer support' CONFIG_PRINTER n
bool 'Logitech busmouse support' CONFIG_BUSMOUSE n
bool 'PS/2 mouse (aka "auxiliary device") support' CONFIG_PSMOUSE n
if [ "$CONFIG_PSMOUSE" = "y" ]; then
bool 'C&T 82C710 mouse port support (as on TI Travelmate)' CONFIG_82C710_MOUSE y
fi
bool 'Microsoft busmouse support' CONFIG_MS_BUSMOUSE n
bool 'ATIXL busmouse support' CONFIG_ATIXL_BUSMOUSE n
bool 'QIC-02 tape support' CONFIG_QIC02_TAPE n
if [ "$CONFIG_QIC02_TAPE" = "y" ]; then
bool 'Do you want runtime configuration for QIC-02' CONFIG_QIC02_DYNCONF y
if [ "$CONFIG_QIC02_DYNCONF" != "y" ]; then
comment '>>> Edit configuration parameters in ./include/linux/tpqic02.h!'
else
comment '>>> Setting runtime QIC-02 configuration is done with qic02conf'
comment '>>> Which is available from ftp://ftp.funet.fi/pub/OS/Linux/BETA/QIC-02/'
fi
fi
bool 'QIC-117 tape support' CONFIG_FTAPE n
if [ "$CONFIG_FTAPE" = "y" ]; then
int ' number of ftape buffers' NR_FTAPE_BUFFERS 3
fi
bool 'Zilog serial support' CONFIG_SUN_ZS n
comment 'Sound'
bool 'Sound card support' CONFIG_SOUND n
bool 'Sun Audio support' CONFIG_SUN_AUDIO n
comment 'Kernel hacking'
#bool 'Debug kmalloc/kfree' CONFIG_DEBUG_MALLOC n
bool 'Debug kmalloc/kfree' CONFIG_DEBUG_MALLOC n
bool 'Kernel profiling support' CONFIG_PROFILE n
if [ "$CONFIG_PROFILE" = "y" ]; then
int ' Profile shift count' CONFIG_PROFILE_SHIFT 2
......
......@@ -18,15 +18,15 @@
.S.o:
$(CC) -D__ASSEMBLY__ -ansi -c $< -o $*.o
OBJS = entry.o traps.o irq.o process.o promops.o signal.o ioport.o setup.o \
idprom.o probe.o
OBJS = entry.o traps.o irq.o process.o signal.o ioport.o setup.o \
idprom.o probe.o mp.o c_mp.o
all: kernel.o head.o
head.o: head.s
head.s: head.S $(TOPDIR)/include/asm-sparc/head.h
$(CPP) -D__ASSEMBLY__ -ansi -o $*.s $<
head.s: head.S
$(CPP) -D__KERNEL__ -D__ASSEMBLY__ -ansi -o $*.s $<
kernel.o: $(OBJS)
$(LD) -r -o kernel.o $(OBJS)
......@@ -34,6 +34,7 @@ kernel.o: $(OBJS)
dep:
$(CPP) -M *.c > .depend
$(CPP) -M -D__ASSEMBLY__ -ansi *.S >>.depend
dummy:
......
/* V9head.S: Initial boot code for the V9 Sparc under Linux.
*
* Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
*
*/
#include <asm/cprefix.h>
.text
.globl start
.globl _start
.globl C_LABEL(trapbase)
_start:
start:
C_LABEL(trapbase):
/* mp.c: SMP cpu idling and dispatch on the Sparc.
*
* Copyright (C) 1995 David S. Miller
*/
#include <asm/mp.h>
#include <asm/mbus.h>
struct sparc_percpu *percpu_table;
void
sparc_cpu_init(void)
{
/* We now have our per-cpu mappings ok, and we should
* be good to go.
*/
/* Do cache crap here. */
/* CPU initted, idle the puppy. */
return;
}
extern thiscpus_mid;
void
sparc_cpu_idle(void)
{
int cpuid;
/* cpuid = get_cpuid(); */
cpuid = (thiscpus_mid&(~8));
/* printk("SMP: cpu%d has entered idle loop", cpuid); */
/* Say that we exist and set up. */
percpu_table[cpuid].cpuid = cpuid;
percpu_table[cpuid].cpu_is_alive = 0x1;
percpu_table[cpuid].cpu_is_idling = 0x1;
/* Let other cpus catch up. */
while(linux_smp_still_initting) ;
printk("cpu%d done spinning\n", get_cpuid());
for(;;) ; /* Do something useful here... */
return;
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
/* ioport.c: I/O access on the Sparc. Work in progress.. Most of the things
* in this file are for the sole purpose of getting the kernel
* through the compiler. :-)
/* ioport.c: Simple io mapping allocator.
*
* Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
* Copyright (C) 1995 Miguel de Icaza (miguel@nuclecu.unam.mx)
*
* The routines in this file should be changed for a memory allocator
* that would be setup just like NetBSD does : you create regions that
* are administered by a general purpose allocator, and then you call
* that allocator with your handle and the block size instead of this
* weak stuff.
*
* XXX No joke, this needs to be rewritten badly. XXX
*/
#include <linux/sched.h>
......@@ -10,3 +17,95 @@
#include <linux/errno.h>
#include <linux/types.h>
#include <linux/ioport.h>
#include <asm/io.h>
#include <asm/vaddrs.h>
#include <asm/oplib.h>
/* This points to the next to use virtual memory for io mappings */
static long next_free_region = IOBASE_VADDR;
static long dvma_next_free = DVMA_VADDR;
/*
* sparc_alloc_dev:
* Map and allocates an obio device.
* Implements a simple linear allocator, you can force the function
* to use your own mapping, but in practice this should not be used.
*
* Input:
* address: the obio address to map
* virtual: if non zero, specifies a fixed virtual address where
* the mapping should take place.
* len: the length of the mapping
* bus_type: The bus on which this io area sits.
*
* Returns:
* The virtual address where the mapping actually took place.
*/
void *sparc_alloc_io (void *address, void *virtual, int len, char *name,
int bus_type, int rdonly)
{
unsigned long vaddr, base_address;
unsigned long addr = (unsigned long) address;
if (virtual){
vaddr = (unsigned long) virtual;
} else {
vaddr = next_free_region;
}
if (((unsigned long) virtual + len) > (IOBASE_VADDR + IOBASE_LEN)){
printk ("alloc_io: Mapping ouside IOBASE area\n");
prom_halt ();
}
if (check_region (vaddr, len)){
printk ("alloc_io: 0x%lx is already in use\n", vaddr);
prom_halt ();
}
/* Tell Linux resource manager about the mapping */
request_region (vaddr, len, name);
base_address = vaddr;
/* Do the actual mapping */
for (; len > 0; len -= PAGE_SIZE){
mapioaddr (addr, vaddr, bus_type, rdonly);
vaddr += PAGE_SIZE;
addr += PAGE_SIZE;
if (!virtual)
next_free_region += PAGE_SIZE;
}
return (void *) base_address;
}
/* Does DVMA allocations with PAGE_SIZE granulatity */
void *sparc_dvma_malloc (int len, char *name)
{
unsigned long vaddr, base_address;
vaddr = dvma_next_free;
if (check_region (vaddr, len)){
printk ("alloc_dma: 0x%lx is already in use\n", vaddr);
prom_halt ();
}
if (vaddr + len > (DVMA_VADDR + DVMA_LEN)){
printk ("alloc_dvma: out of dvma memory\n");
prom_halt ();
}
/* Tell Linux resource manager about the mapping */
request_region (vaddr, len, name);
base_address = vaddr;
/* Assign the memory area and remove the cache bit */
/* XXX EWWWWEE!! Sun4c specific, fix now! XXX */
for (; len > 0; len -= PAGE_SIZE){
printk ("Len=%d\n", len);
put_pte (vaddr, get_pte (vaddr) | PTE_NC);
vaddr += PAGE_SIZE;
dvma_next_free += PAGE_SIZE;
}
return (void *) base_address;
}
This diff is collapsed.
/* mp.S: Multiprocessor low-level routines on the Sparc.
*
* Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
*/
#include <asm/cprefix.h>
#include <asm/head.h>
#include <asm/psr.h>
#include <asm/asi.h>
#include <asm/vaddrs.h>
#include <asm/contregs.h>
.text
.align 4
/* When we start up a cpu for the first time it enters this routine.
* This initializes the chip from whatever state the prom left it
* in and sets PIL in %psr to 15, no irqs.
*/
.globl C_LABEL(sparc_cpu_startup)
C_LABEL(sparc_cpu_startup):
/* Set up a sane %psr -- PIL<0xf> S<0x1> PS<0x1> CWP<0x0> */
set (PSR_PIL | PSR_S | PSR_PS), %g1
wr %g1, 0x0, %psr ! traps off though
WRITE_PAUSE
/* Our %wim is one behind CWP */
wr %g0, 0x2, %wim
rd %tbr, %g4
or %g0, 0x3, %g5
sll %g5, 20, %g5
and %g4, %g5, %g4 ! Mask cpu-id bits
/* Give ourselves a stack. */
set PERCPU_VADDR, %g1
add %g1, %g4, %g1
set PERCPU_KSTACK_OFFSET, %g5
add %g1, %g5, %g1
set 0x1000, %g5
add %g1, %g5, %g1 ! end of stack
sub %g1, (96+96+80), %g1 ! set up a frame
andn %g1, 0x7, %g1
or %g1, 0x0, %fp ! bottom of frame
add %fp, (96+80), %sp ! top of frame
/* Set up per-cpu trap table pointer. In actuality, the virtual
* address for the trap table on every cpu points to the same
* physical address, this virtual address is only used for cpu
* identification purposes.
*/
#if 0
/* set PERCPU_VADDR, %g1 */
/* add %g1, %g4, %g1 */
/* add %g1, PERCPU_TBR_OFFSET, %g1 */
set C_LABEL(thiscpus_tbr), %g1
ld [%g1], %g1
wr %g1, 0x0, %tbr
WRITE_PAUSE
#else
set C_LABEL(trapbase), %g3
wr %g3, 0x0, %tbr
WRITE_PAUSE
#endif
/* Turn on traps (PSR_ET). */
rd %psr, %g1
wr %g1, PSR_ET, %psr ! traps on
#if 0
1: nop
b 1b
nop
#endif
/* Call C-code to do the rest of the real work. */
call C_LABEL(sparc_cpu_init)
nop
/* Call cpu-idle routine so we can start it up later on. */
call C_LABEL(sparc_cpu_idle)
nop
/* Done... This cpu should me spinning in a test loop.
* If execution gets here, something really bad happened.
*/
call C_LABEL(prom_halt) ! Seems reasonable...
nop
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment