You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc-merge
This commit is contained in:
@@ -139,17 +139,14 @@ drivers-$(CONFIG_CPM2) += arch/ppc/8260_io/
|
||||
|
||||
drivers-$(CONFIG_OPROFILE) += arch/powerpc/oprofile/
|
||||
|
||||
defaultimage-$(CONFIG_PPC32) := zImage
|
||||
# Default to zImage, override when needed
|
||||
defaultimage-y := zImage
|
||||
defaultimage-$(CONFIG_PPC_ISERIES) := vmlinux
|
||||
defaultimage-$(CONFIG_PPC_PSERIES) := zImage
|
||||
KBUILD_IMAGE := $(defaultimage-y)
|
||||
all: $(KBUILD_IMAGE)
|
||||
|
||||
CPPFLAGS_vmlinux.lds := -Upowerpc
|
||||
|
||||
# All the instructions talk about "make bzImage".
|
||||
bzImage: zImage
|
||||
|
||||
BOOT_TARGETS = zImage zImage.initrd znetboot znetboot.initrd vmlinux.sm uImage
|
||||
|
||||
.PHONY: $(BOOT_TARGETS)
|
||||
|
||||
+34
-15
@@ -25,8 +25,8 @@ HOSTCC := gcc
|
||||
BOOTCFLAGS := $(HOSTCFLAGS) -fno-builtin -nostdinc -isystem \
|
||||
$(shell $(CROSS32CC) -print-file-name=include) -fPIC
|
||||
BOOTAFLAGS := -D__ASSEMBLY__ $(BOOTCFLAGS) -traditional -nostdinc
|
||||
BOOTLFLAGS := -T $(srctree)/$(src)/zImage.lds
|
||||
OBJCOPYFLAGS := contents,alloc,load,readonly,data
|
||||
OBJCOPY_COFF_ARGS := -O aixcoff-rs6000 --set-start 0x500000
|
||||
|
||||
zlib := infblock.c infcodes.c inffast.c inflate.c inftrees.c infutil.c
|
||||
zlibheader := infblock.h infcodes.h inffast.h inftrees.h infutil.h
|
||||
@@ -35,7 +35,7 @@ zliblinuxheader := zlib.h zconf.h zutil.h
|
||||
$(addprefix $(obj)/,$(zlib) main.o): $(addprefix $(obj)/,$(zliblinuxheader)) $(addprefix $(obj)/,$(zlibheader))
|
||||
#$(addprefix $(obj)/,main.o): $(addprefix $(obj)/,zlib.h)
|
||||
|
||||
src-boot := string.S prom.c main.c div64.S crt0.S
|
||||
src-boot := crt0.S string.S prom.c stdio.c main.c div64.S
|
||||
src-boot += $(zlib)
|
||||
src-boot := $(addprefix $(obj)/, $(src-boot))
|
||||
obj-boot := $(addsuffix .o, $(basename $(src-boot)))
|
||||
@@ -70,7 +70,7 @@ quiet_cmd_bootas = BOOTAS $@
|
||||
cmd_bootas = $(CROSS32CC) -Wp,-MD,$(depfile) $(BOOTAFLAGS) -c -o $@ $<
|
||||
|
||||
quiet_cmd_bootld = BOOTLD $@
|
||||
cmd_bootld = $(CROSS32LD) $(BOOTLFLAGS) -o $@ $(2)
|
||||
cmd_bootld = $(CROSS32LD) -T $(srctree)/$(src)/$(3) -o $@ $(2)
|
||||
|
||||
$(patsubst %.c,%.o, $(filter %.c, $(src-boot))): %.o: %.c
|
||||
$(call if_changed_dep,bootcc)
|
||||
@@ -87,12 +87,14 @@ obj-sec = $(foreach section, $(1), $(patsubst %,$(obj)/kernel-%.o, $(section)))
|
||||
src-sec = $(foreach section, $(1), $(patsubst %,$(obj)/kernel-%.c, $(section)))
|
||||
gz-sec = $(foreach section, $(1), $(patsubst %,$(obj)/kernel-%.gz, $(section)))
|
||||
|
||||
hostprogs-y := addnote addRamDisk
|
||||
targets += zImage.vmode zImage.initrd.vmode zImage zImage.initrd \
|
||||
$(patsubst $(obj)/%,%, $(call obj-sec, $(required) $(initrd))) \
|
||||
$(patsubst $(obj)/%,%, $(call src-sec, $(required) $(initrd))) \
|
||||
$(patsubst $(obj)/%,%, $(call gz-sec, $(required) $(initrd))) \
|
||||
vmlinux.initrd
|
||||
hostprogs-y := addnote addRamDisk hack-coff
|
||||
|
||||
targets += zImage.vmode zImage.initrd.vmode zImage zImage.initrd \
|
||||
zImage.coff zImage.initrd.coff \
|
||||
$(patsubst $(obj)/%,%, $(call obj-sec, $(required) $(initrd))) \
|
||||
$(patsubst $(obj)/%,%, $(call src-sec, $(required) $(initrd))) \
|
||||
$(patsubst $(obj)/%,%, $(call gz-sec, $(required) $(initrd))) \
|
||||
vmlinux.initrd
|
||||
extra-y := initrd.o
|
||||
|
||||
quiet_cmd_ramdisk = RAMDISK $@
|
||||
@@ -114,6 +116,10 @@ quiet_cmd_addsection = ADDSEC $@
|
||||
quiet_cmd_addnote = ADDNOTE $@
|
||||
cmd_addnote = $(obj)/addnote $@
|
||||
|
||||
quiet_cmd_gencoff = COFF $@
|
||||
cmd_gencoff = $(OBJCOPY) $(OBJCOPY_COFF_ARGS) $@ && \
|
||||
$(obj)/hack-coff $@
|
||||
|
||||
$(call gz-sec, $(required)): $(obj)/kernel-%.gz: %
|
||||
$(call if_changed,gzip)
|
||||
|
||||
@@ -127,22 +133,35 @@ $(call obj-sec, $(required) $(initrd)): $(obj)/kernel-%.o: $(obj)/kernel-%.c
|
||||
$(call if_changed_dep,bootcc)
|
||||
$(call cmd,addsection)
|
||||
|
||||
$(obj)/zImage.vmode: obj-boot += $(call obj-sec, $(required))
|
||||
$(obj)/zImage.vmode $(obj)/zImage.coff: obj-boot += $(call obj-sec, $(required))
|
||||
$(obj)/zImage.vmode: $(call obj-sec, $(required)) $(obj-boot) $(srctree)/$(src)/zImage.lds
|
||||
$(call cmd,bootld,$(obj-boot))
|
||||
$(call cmd,bootld,$(obj-boot),zImage.lds)
|
||||
|
||||
$(obj)/zImage.initrd.vmode: obj-boot += $(call obj-sec, $(required) $(initrd))
|
||||
$(obj)/zImage.initrd.vmode $(obj)/zImage.initrd.coff: obj-boot += $(call obj-sec, $(required) $(initrd))
|
||||
$(obj)/zImage.initrd.vmode: $(call obj-sec, $(required) $(initrd)) $(obj-boot) $(srctree)/$(src)/zImage.lds
|
||||
$(call cmd,bootld,$(obj-boot))
|
||||
$(call cmd,bootld,$(obj-boot),zImage.lds)
|
||||
|
||||
$(obj)/zImage: $(obj)/zImage.vmode $(obj)/addnote
|
||||
# For 32-bit powermacs, build the COFF images as well as the ELF images.
|
||||
coffimage-$(CONFIG_PPC_PMAC)-$(CONFIG_PPC32) := $(obj)/zImage.coff
|
||||
coffrdimg-$(CONFIG_PPC_PMAC)-$(CONFIG_PPC32) := $(obj)/zImage.initrd.coff
|
||||
|
||||
$(obj)/zImage: $(obj)/zImage.vmode $(obj)/addnote $(coffimage-y-y)
|
||||
@cp -f $< $@
|
||||
$(call if_changed,addnote)
|
||||
|
||||
$(obj)/zImage.initrd: $(obj)/zImage.initrd.vmode $(obj)/addnote
|
||||
$(obj)/zImage.initrd: $(obj)/zImage.initrd.vmode $(obj)/addnote $(coffrdimg-y-y)
|
||||
@cp -f $< $@
|
||||
$(call if_changed,addnote)
|
||||
|
||||
$(obj)/zImage.coff: $(call obj-sec, $(required)) $(obj-boot) $(srctree)/$(src)/zImage.coff.lds $(obj)/hack-coff
|
||||
$(call cmd,bootld,$(obj-boot),zImage.coff.lds)
|
||||
$(call cmd,gencoff)
|
||||
|
||||
$(obj)/zImage.initrd.coff: $(call obj-sec, $(required) $(initrd)) $(obj-boot) \
|
||||
$(srctree)/$(src)/zImage.coff.lds $(obj)/hack-coff
|
||||
$(call cmd,bootld,$(obj-boot),zImage.coff.lds)
|
||||
$(call cmd,gencoff)
|
||||
|
||||
#-----------------------------------------------------------
|
||||
# build u-boot images
|
||||
#-----------------------------------------------------------
|
||||
|
||||
@@ -12,17 +12,23 @@
|
||||
#include "ppc_asm.h"
|
||||
|
||||
.text
|
||||
/* a procedure descriptor used when booting this as a COFF file */
|
||||
_zimage_start_opd:
|
||||
.long _zimage_start, 0, 0, 0
|
||||
|
||||
.globl _zimage_start
|
||||
_zimage_start:
|
||||
/* Work out the offset between the address we were linked at
|
||||
and the address where we're running. */
|
||||
bl 1f
|
||||
|
||||
1:
|
||||
mflr r0
|
||||
1: mflr r0
|
||||
lis r9,1b@ha
|
||||
addi r9,r9,1b@l
|
||||
subf. r0,r9,r0
|
||||
beq 3f
|
||||
beq 3f /* if running at same address as linked */
|
||||
|
||||
/* The .got2 section contains a list of addresses, so add
|
||||
the address offset onto each entry. */
|
||||
lis r9,__got2_start@ha
|
||||
addi r9,r9,__got2_start@l
|
||||
lis r8,__got2_end@ha
|
||||
@@ -32,15 +38,14 @@ _zimage_start:
|
||||
srwi. r8,r8,2
|
||||
mtctr r8
|
||||
add r9,r0,r9
|
||||
2:
|
||||
lwz r8,0(r9)
|
||||
2: lwz r8,0(r9)
|
||||
add r8,r8,r0
|
||||
stw r8,0(r9)
|
||||
addi r9,r9,4
|
||||
bdnz 2b
|
||||
|
||||
3:
|
||||
lis r9,_start@h
|
||||
/* Do a cache flush for our text, in case OF didn't */
|
||||
3: lis r9,_start@h
|
||||
add r9,r0,r9
|
||||
lis r8,_etext@ha
|
||||
addi r8,r8,_etext@l
|
||||
|
||||
@@ -0,0 +1,84 @@
|
||||
/*
|
||||
* hack-coff.c - hack the header of an xcoff file to fill in
|
||||
* a few fields needed by the Open Firmware xcoff loader on
|
||||
* Power Macs but not initialized by objcopy.
|
||||
*
|
||||
* Copyright (C) Paul Mackerras 1997.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <string.h>
|
||||
#include "rs6000.h"
|
||||
|
||||
#define AOUT_MAGIC 0x010b
|
||||
|
||||
#define get_16be(x) ((((unsigned char *)(x))[0] << 8) \
|
||||
+ ((unsigned char *)(x))[1])
|
||||
#define put_16be(x, v) (((unsigned char *)(x))[0] = (v) >> 8, \
|
||||
((unsigned char *)(x))[1] = (v) & 0xff)
|
||||
#define get_32be(x) ((((unsigned char *)(x))[0] << 24) \
|
||||
+ (((unsigned char *)(x))[1] << 16) \
|
||||
+ (((unsigned char *)(x))[2] << 8) \
|
||||
+ ((unsigned char *)(x))[3])
|
||||
|
||||
int
|
||||
main(int ac, char **av)
|
||||
{
|
||||
int fd;
|
||||
int i, nsect;
|
||||
int aoutsz;
|
||||
struct external_filehdr fhdr;
|
||||
AOUTHDR aout;
|
||||
struct external_scnhdr shdr;
|
||||
|
||||
if (ac != 2) {
|
||||
fprintf(stderr, "Usage: hack-coff coff-file\n");
|
||||
exit(1);
|
||||
}
|
||||
if ((fd = open(av[1], 2)) == -1) {
|
||||
perror(av[2]);
|
||||
exit(1);
|
||||
}
|
||||
if (read(fd, &fhdr, sizeof(fhdr)) != sizeof(fhdr))
|
||||
goto readerr;
|
||||
i = get_16be(fhdr.f_magic);
|
||||
if (i != U802TOCMAGIC && i != U802WRMAGIC && i != U802ROMAGIC) {
|
||||
fprintf(stderr, "%s: not an xcoff file\n", av[1]);
|
||||
exit(1);
|
||||
}
|
||||
aoutsz = get_16be(fhdr.f_opthdr);
|
||||
if (read(fd, &aout, aoutsz) != aoutsz)
|
||||
goto readerr;
|
||||
nsect = get_16be(fhdr.f_nscns);
|
||||
for (i = 0; i < nsect; ++i) {
|
||||
if (read(fd, &shdr, sizeof(shdr)) != sizeof(shdr))
|
||||
goto readerr;
|
||||
if (strcmp(shdr.s_name, ".text") == 0) {
|
||||
put_16be(aout.o_snentry, i+1);
|
||||
put_16be(aout.o_sntext, i+1);
|
||||
} else if (strcmp(shdr.s_name, ".data") == 0) {
|
||||
put_16be(aout.o_sndata, i+1);
|
||||
} else if (strcmp(shdr.s_name, ".bss") == 0) {
|
||||
put_16be(aout.o_snbss, i+1);
|
||||
}
|
||||
}
|
||||
put_16be(aout.magic, AOUT_MAGIC);
|
||||
if (lseek(fd, (long) sizeof(struct external_filehdr), 0) == -1
|
||||
|| write(fd, &aout, aoutsz) != aoutsz) {
|
||||
fprintf(stderr, "%s: write error\n", av[1]);
|
||||
exit(1);
|
||||
}
|
||||
close(fd);
|
||||
exit(0);
|
||||
|
||||
readerr:
|
||||
fprintf(stderr, "%s: read error or file too short\n", av[1]);
|
||||
exit(1);
|
||||
}
|
||||
+22
-24
@@ -21,8 +21,8 @@ extern void flush_cache(void *, unsigned long);
|
||||
|
||||
|
||||
/* Value picked to match that used by yaboot */
|
||||
#define PROG_START 0x01400000
|
||||
#define RAM_END (512<<20) // Fixme: use OF */
|
||||
#define PROG_START 0x01400000 /* only used on 64-bit systems */
|
||||
#define RAM_END (512<<20) /* Fixme: use OF */
|
||||
#define ONE_MB 0x100000
|
||||
|
||||
extern char _start[];
|
||||
@@ -160,6 +160,17 @@ static int is_elf64(void *hdr)
|
||||
elfoffset = (unsigned long)elf64ph->p_offset;
|
||||
vmlinux.size = (unsigned long)elf64ph->p_filesz + elfoffset;
|
||||
vmlinux.memsize = (unsigned long)elf64ph->p_memsz + elfoffset;
|
||||
|
||||
#if defined(PROG_START)
|
||||
/*
|
||||
* Maintain a "magic" minimum address. This keeps some older
|
||||
* firmware platforms running.
|
||||
*/
|
||||
|
||||
if (claim_base < PROG_START)
|
||||
claim_base = PROG_START;
|
||||
#endif
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -206,12 +217,18 @@ void start(unsigned long a1, unsigned long a2, void *promptr, void *sp)
|
||||
exit();
|
||||
if (getprop(chosen_handle, "stdout", &stdout, sizeof(stdout)) != 4)
|
||||
exit();
|
||||
stderr = stdout;
|
||||
if (getprop(chosen_handle, "stdin", &stdin, sizeof(stdin)) != 4)
|
||||
exit();
|
||||
|
||||
printf("\n\rzImage starting: loaded at 0x%p (sp: 0x%p)\n\r", _start, sp);
|
||||
|
||||
/*
|
||||
* The first available claim_base must be above the end of the
|
||||
* the loaded kernel wrapper file (_start to _end includes the
|
||||
* initrd image if it is present) and rounded up to a nice
|
||||
* 1 MB boundary for good measure.
|
||||
*/
|
||||
|
||||
claim_base = _ALIGN_UP((unsigned long)_end, ONE_MB);
|
||||
|
||||
vmlinuz.addr = (unsigned long)_vmlinux_start;
|
||||
vmlinuz.size = (unsigned long)(_vmlinux_end - _vmlinux_start);
|
||||
|
||||
@@ -228,25 +245,6 @@ void start(unsigned long a1, unsigned long a2, void *promptr, void *sp)
|
||||
exit();
|
||||
}
|
||||
|
||||
/*
|
||||
* The first available claim_base must be above the end of the
|
||||
* the loaded kernel wrapper file (_start to _end includes the
|
||||
* initrd image if it is present) and rounded up to a nice
|
||||
* 1 MB boundary for good measure.
|
||||
*/
|
||||
|
||||
claim_base = _ALIGN_UP((unsigned long)_end, ONE_MB);
|
||||
|
||||
#if defined(PROG_START)
|
||||
/*
|
||||
* Maintain a "magic" minimum address. This keeps some older
|
||||
* firmware platforms running.
|
||||
*/
|
||||
|
||||
if (claim_base < PROG_START)
|
||||
claim_base = PROG_START;
|
||||
#endif
|
||||
|
||||
/* We need to claim the memsize plus the file offset since gzip
|
||||
* will expand the header (file offset), then the kernel, then
|
||||
* possible rubbish we don't care about. But the kernel bss must
|
||||
|
||||
+111
-445
File diff suppressed because it is too large
Load Diff
+27
-11
@@ -1,18 +1,34 @@
|
||||
#ifndef _PPC_BOOT_PROM_H_
|
||||
#define _PPC_BOOT_PROM_H_
|
||||
|
||||
extern int (*prom) (void *);
|
||||
extern void *chosen_handle;
|
||||
typedef void *phandle;
|
||||
typedef void *ihandle;
|
||||
|
||||
extern void *stdin;
|
||||
extern void *stdout;
|
||||
extern void *stderr;
|
||||
extern int (*prom) (void *);
|
||||
extern phandle chosen_handle;
|
||||
extern ihandle stdout;
|
||||
|
||||
int call_prom(const char *service, int nargs, int nret, ...);
|
||||
int call_prom_ret(const char *service, int nargs, int nret,
|
||||
unsigned int *rets, ...);
|
||||
|
||||
extern int write(void *handle, void *ptr, int nb);
|
||||
extern int read(void *handle, void *ptr, int nb);
|
||||
extern void exit(void);
|
||||
extern void pause(void);
|
||||
extern void *finddevice(const char *);
|
||||
extern void *claim(unsigned long virt, unsigned long size, unsigned long align);
|
||||
extern int getprop(void *phandle, const char *name, void *buf, int buflen);
|
||||
extern void *claim(unsigned long virt, unsigned long size, unsigned long aln);
|
||||
|
||||
static inline void exit(void)
|
||||
{
|
||||
call_prom("exit", 0, 0);
|
||||
}
|
||||
|
||||
static inline phandle finddevice(const char *name)
|
||||
{
|
||||
return (phandle) call_prom("finddevice", 1, 1, name);
|
||||
}
|
||||
|
||||
static inline int getprop(void *phandle, const char *name,
|
||||
void *buf, int buflen)
|
||||
{
|
||||
return call_prom("getprop", 4, 1, phandle, name, buf, buflen);
|
||||
}
|
||||
|
||||
#endif /* _PPC_BOOT_PROM_H_ */
|
||||
|
||||
@@ -0,0 +1,243 @@
|
||||
/* IBM RS/6000 "XCOFF" file definitions for BFD.
|
||||
Copyright (C) 1990, 1991 Free Software Foundation, Inc.
|
||||
FIXME: Can someone provide a transliteration of this name into ASCII?
|
||||
Using the following chars caused a compiler warning on HIUX (so I replaced
|
||||
them with octal escapes), and isn't useful without an understanding of what
|
||||
character set it is.
|
||||
Written by Mimi Ph\373\364ng-Th\345o V\365 of IBM
|
||||
and John Gilmore of Cygnus Support. */
|
||||
|
||||
/********************** FILE HEADER **********************/
|
||||
|
||||
struct external_filehdr {
|
||||
char f_magic[2]; /* magic number */
|
||||
char f_nscns[2]; /* number of sections */
|
||||
char f_timdat[4]; /* time & date stamp */
|
||||
char f_symptr[4]; /* file pointer to symtab */
|
||||
char f_nsyms[4]; /* number of symtab entries */
|
||||
char f_opthdr[2]; /* sizeof(optional hdr) */
|
||||
char f_flags[2]; /* flags */
|
||||
};
|
||||
|
||||
/* IBM RS/6000 */
|
||||
#define U802WRMAGIC 0730 /* writeable text segments **chh** */
|
||||
#define U802ROMAGIC 0735 /* readonly sharable text segments */
|
||||
#define U802TOCMAGIC 0737 /* readonly text segments and TOC */
|
||||
|
||||
#define BADMAG(x) \
|
||||
((x).f_magic != U802ROMAGIC && (x).f_magic != U802WRMAGIC && \
|
||||
(x).f_magic != U802TOCMAGIC)
|
||||
|
||||
#define FILHDR struct external_filehdr
|
||||
#define FILHSZ 20
|
||||
|
||||
|
||||
/********************** AOUT "OPTIONAL HEADER" **********************/
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned char magic[2]; /* type of file */
|
||||
unsigned char vstamp[2]; /* version stamp */
|
||||
unsigned char tsize[4]; /* text size in bytes, padded to FW bdry */
|
||||
unsigned char dsize[4]; /* initialized data " " */
|
||||
unsigned char bsize[4]; /* uninitialized data " " */
|
||||
unsigned char entry[4]; /* entry pt. */
|
||||
unsigned char text_start[4]; /* base of text used for this file */
|
||||
unsigned char data_start[4]; /* base of data used for this file */
|
||||
unsigned char o_toc[4]; /* address of TOC */
|
||||
unsigned char o_snentry[2]; /* section number of entry point */
|
||||
unsigned char o_sntext[2]; /* section number of .text section */
|
||||
unsigned char o_sndata[2]; /* section number of .data section */
|
||||
unsigned char o_sntoc[2]; /* section number of TOC */
|
||||
unsigned char o_snloader[2]; /* section number of .loader section */
|
||||
unsigned char o_snbss[2]; /* section number of .bss section */
|
||||
unsigned char o_algntext[2]; /* .text alignment */
|
||||
unsigned char o_algndata[2]; /* .data alignment */
|
||||
unsigned char o_modtype[2]; /* module type (??) */
|
||||
unsigned char o_cputype[2]; /* cpu type */
|
||||
unsigned char o_maxstack[4]; /* max stack size (??) */
|
||||
unsigned char o_maxdata[4]; /* max data size (??) */
|
||||
unsigned char o_resv2[12]; /* reserved */
|
||||
}
|
||||
AOUTHDR;
|
||||
|
||||
#define AOUTSZ 72
|
||||
#define SMALL_AOUTSZ (28)
|
||||
#define AOUTHDRSZ 72
|
||||
|
||||
#define RS6K_AOUTHDR_OMAGIC 0x0107 /* old: text & data writeable */
|
||||
#define RS6K_AOUTHDR_NMAGIC 0x0108 /* new: text r/o, data r/w */
|
||||
#define RS6K_AOUTHDR_ZMAGIC 0x010B /* paged: text r/o, both page-aligned */
|
||||
|
||||
|
||||
/********************** SECTION HEADER **********************/
|
||||
|
||||
|
||||
struct external_scnhdr {
|
||||
char s_name[8]; /* section name */
|
||||
char s_paddr[4]; /* physical address, aliased s_nlib */
|
||||
char s_vaddr[4]; /* virtual address */
|
||||
char s_size[4]; /* section size */
|
||||
char s_scnptr[4]; /* file ptr to raw data for section */
|
||||
char s_relptr[4]; /* file ptr to relocation */
|
||||
char s_lnnoptr[4]; /* file ptr to line numbers */
|
||||
char s_nreloc[2]; /* number of relocation entries */
|
||||
char s_nlnno[2]; /* number of line number entries*/
|
||||
char s_flags[4]; /* flags */
|
||||
};
|
||||
|
||||
/*
|
||||
* names of "special" sections
|
||||
*/
|
||||
#define _TEXT ".text"
|
||||
#define _DATA ".data"
|
||||
#define _BSS ".bss"
|
||||
#define _PAD ".pad"
|
||||
#define _LOADER ".loader"
|
||||
|
||||
#define SCNHDR struct external_scnhdr
|
||||
#define SCNHSZ 40
|
||||
|
||||
/* XCOFF uses a special .loader section with type STYP_LOADER. */
|
||||
#define STYP_LOADER 0x1000
|
||||
|
||||
/* XCOFF uses a special .debug section with type STYP_DEBUG. */
|
||||
#define STYP_DEBUG 0x2000
|
||||
|
||||
/* XCOFF handles line number or relocation overflow by creating
|
||||
another section header with STYP_OVRFLO set. */
|
||||
#define STYP_OVRFLO 0x8000
|
||||
|
||||
/********************** LINE NUMBERS **********************/
|
||||
|
||||
/* 1 line number entry for every "breakpointable" source line in a section.
|
||||
* Line numbers are grouped on a per function basis; first entry in a function
|
||||
* grouping will have l_lnno = 0 and in place of physical address will be the
|
||||
* symbol table index of the function name.
|
||||
*/
|
||||
struct external_lineno {
|
||||
union {
|
||||
char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/
|
||||
char l_paddr[4]; /* (physical) address of line number */
|
||||
} l_addr;
|
||||
char l_lnno[2]; /* line number */
|
||||
};
|
||||
|
||||
|
||||
#define LINENO struct external_lineno
|
||||
#define LINESZ 6
|
||||
|
||||
|
||||
/********************** SYMBOLS **********************/
|
||||
|
||||
#define E_SYMNMLEN 8 /* # characters in a symbol name */
|
||||
#define E_FILNMLEN 14 /* # characters in a file name */
|
||||
#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */
|
||||
|
||||
struct external_syment
|
||||
{
|
||||
union {
|
||||
char e_name[E_SYMNMLEN];
|
||||
struct {
|
||||
char e_zeroes[4];
|
||||
char e_offset[4];
|
||||
} e;
|
||||
} e;
|
||||
char e_value[4];
|
||||
char e_scnum[2];
|
||||
char e_type[2];
|
||||
char e_sclass[1];
|
||||
char e_numaux[1];
|
||||
};
|
||||
|
||||
|
||||
|
||||
#define N_BTMASK (017)
|
||||
#define N_TMASK (060)
|
||||
#define N_BTSHFT (4)
|
||||
#define N_TSHIFT (2)
|
||||
|
||||
|
||||
union external_auxent {
|
||||
struct {
|
||||
char x_tagndx[4]; /* str, un, or enum tag indx */
|
||||
union {
|
||||
struct {
|
||||
char x_lnno[2]; /* declaration line number */
|
||||
char x_size[2]; /* str/union/array size */
|
||||
} x_lnsz;
|
||||
char x_fsize[4]; /* size of function */
|
||||
} x_misc;
|
||||
union {
|
||||
struct { /* if ISFCN, tag, or .bb */
|
||||
char x_lnnoptr[4]; /* ptr to fcn line # */
|
||||
char x_endndx[4]; /* entry ndx past block end */
|
||||
} x_fcn;
|
||||
struct { /* if ISARY, up to 4 dimen. */
|
||||
char x_dimen[E_DIMNUM][2];
|
||||
} x_ary;
|
||||
} x_fcnary;
|
||||
char x_tvndx[2]; /* tv index */
|
||||
} x_sym;
|
||||
|
||||
union {
|
||||
char x_fname[E_FILNMLEN];
|
||||
struct {
|
||||
char x_zeroes[4];
|
||||
char x_offset[4];
|
||||
} x_n;
|
||||
} x_file;
|
||||
|
||||
struct {
|
||||
char x_scnlen[4]; /* section length */
|
||||
char x_nreloc[2]; /* # relocation entries */
|
||||
char x_nlinno[2]; /* # line numbers */
|
||||
} x_scn;
|
||||
|
||||
struct {
|
||||
char x_tvfill[4]; /* tv fill value */
|
||||
char x_tvlen[2]; /* length of .tv */
|
||||
char x_tvran[2][2]; /* tv range */
|
||||
} x_tv; /* info about .tv section (in auxent of symbol .tv)) */
|
||||
|
||||
struct {
|
||||
unsigned char x_scnlen[4];
|
||||
unsigned char x_parmhash[4];
|
||||
unsigned char x_snhash[2];
|
||||
unsigned char x_smtyp[1];
|
||||
unsigned char x_smclas[1];
|
||||
unsigned char x_stab[4];
|
||||
unsigned char x_snstab[2];
|
||||
} x_csect;
|
||||
|
||||
};
|
||||
|
||||
#define SYMENT struct external_syment
|
||||
#define SYMESZ 18
|
||||
#define AUXENT union external_auxent
|
||||
#define AUXESZ 18
|
||||
#define DBXMASK 0x80 /* for dbx storage mask */
|
||||
#define SYMNAME_IN_DEBUG(symptr) ((symptr)->n_sclass & DBXMASK)
|
||||
|
||||
|
||||
|
||||
/********************** RELOCATION DIRECTIVES **********************/
|
||||
|
||||
|
||||
struct external_reloc {
|
||||
char r_vaddr[4];
|
||||
char r_symndx[4];
|
||||
char r_size[1];
|
||||
char r_type[1];
|
||||
};
|
||||
|
||||
|
||||
#define RELOC struct external_reloc
|
||||
#define RELSZ 10
|
||||
|
||||
#define DEFAULT_DATA_SECTION_ALIGNMENT 4
|
||||
#define DEFAULT_BSS_SECTION_ALIGNMENT 4
|
||||
#define DEFAULT_TEXT_SECTION_ALIGNMENT 4
|
||||
/* For new sections we havn't heard of before */
|
||||
#define DEFAULT_SECTION_ALIGNMENT 4
|
||||
@@ -0,0 +1,325 @@
|
||||
/*
|
||||
* Copyright (C) Paul Mackerras 1997.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#include <stdarg.h>
|
||||
#include <stddef.h>
|
||||
#include "string.h"
|
||||
#include "stdio.h"
|
||||
#include "prom.h"
|
||||
|
||||
size_t strnlen(const char * s, size_t count)
|
||||
{
|
||||
const char *sc;
|
||||
|
||||
for (sc = s; count-- && *sc != '\0'; ++sc)
|
||||
/* nothing */;
|
||||
return sc - s;
|
||||
}
|
||||
|
||||
extern unsigned int __div64_32(unsigned long long *dividend,
|
||||
unsigned int divisor);
|
||||
|
||||
/* The unnecessary pointer compare is there
|
||||
* to check for type safety (n must be 64bit)
|
||||
*/
|
||||
# define do_div(n,base) ({ \
|
||||
unsigned int __base = (base); \
|
||||
unsigned int __rem; \
|
||||
(void)(((typeof((n)) *)0) == ((unsigned long long *)0)); \
|
||||
if (((n) >> 32) == 0) { \
|
||||
__rem = (unsigned int)(n) % __base; \
|
||||
(n) = (unsigned int)(n) / __base; \
|
||||
} else \
|
||||
__rem = __div64_32(&(n), __base); \
|
||||
__rem; \
|
||||
})
|
||||
|
||||
static int skip_atoi(const char **s)
|
||||
{
|
||||
int i, c;
|
||||
|
||||
for (i = 0; '0' <= (c = **s) && c <= '9'; ++*s)
|
||||
i = i*10 + c - '0';
|
||||
return i;
|
||||
}
|
||||
|
||||
#define ZEROPAD 1 /* pad with zero */
|
||||
#define SIGN 2 /* unsigned/signed long */
|
||||
#define PLUS 4 /* show plus */
|
||||
#define SPACE 8 /* space if plus */
|
||||
#define LEFT 16 /* left justified */
|
||||
#define SPECIAL 32 /* 0x */
|
||||
#define LARGE 64 /* use 'ABCDEF' instead of 'abcdef' */
|
||||
|
||||
static char * number(char * str, unsigned long long num, int base, int size, int precision, int type)
|
||||
{
|
||||
char c,sign,tmp[66];
|
||||
const char *digits="0123456789abcdefghijklmnopqrstuvwxyz";
|
||||
int i;
|
||||
|
||||
if (type & LARGE)
|
||||
digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
||||
if (type & LEFT)
|
||||
type &= ~ZEROPAD;
|
||||
if (base < 2 || base > 36)
|
||||
return 0;
|
||||
c = (type & ZEROPAD) ? '0' : ' ';
|
||||
sign = 0;
|
||||
if (type & SIGN) {
|
||||
if ((signed long long)num < 0) {
|
||||
sign = '-';
|
||||
num = - (signed long long)num;
|
||||
size--;
|
||||
} else if (type & PLUS) {
|
||||
sign = '+';
|
||||
size--;
|
||||
} else if (type & SPACE) {
|
||||
sign = ' ';
|
||||
size--;
|
||||
}
|
||||
}
|
||||
if (type & SPECIAL) {
|
||||
if (base == 16)
|
||||
size -= 2;
|
||||
else if (base == 8)
|
||||
size--;
|
||||
}
|
||||
i = 0;
|
||||
if (num == 0)
|
||||
tmp[i++]='0';
|
||||
else while (num != 0) {
|
||||
tmp[i++] = digits[do_div(num, base)];
|
||||
}
|
||||
if (i > precision)
|
||||
precision = i;
|
||||
size -= precision;
|
||||
if (!(type&(ZEROPAD+LEFT)))
|
||||
while(size-->0)
|
||||
*str++ = ' ';
|
||||
if (sign)
|
||||
*str++ = sign;
|
||||
if (type & SPECIAL) {
|
||||
if (base==8)
|
||||
*str++ = '0';
|
||||
else if (base==16) {
|
||||
*str++ = '0';
|
||||
*str++ = digits[33];
|
||||
}
|
||||
}
|
||||
if (!(type & LEFT))
|
||||
while (size-- > 0)
|
||||
*str++ = c;
|
||||
while (i < precision--)
|
||||
*str++ = '0';
|
||||
while (i-- > 0)
|
||||
*str++ = tmp[i];
|
||||
while (size-- > 0)
|
||||
*str++ = ' ';
|
||||
return str;
|
||||
}
|
||||
|
||||
int vsprintf(char *buf, const char *fmt, va_list args)
|
||||
{
|
||||
int len;
|
||||
unsigned long long num;
|
||||
int i, base;
|
||||
char * str;
|
||||
const char *s;
|
||||
|
||||
int flags; /* flags to number() */
|
||||
|
||||
int field_width; /* width of output field */
|
||||
int precision; /* min. # of digits for integers; max
|
||||
number of chars for from string */
|
||||
int qualifier; /* 'h', 'l', or 'L' for integer fields */
|
||||
/* 'z' support added 23/7/1999 S.H. */
|
||||
/* 'z' changed to 'Z' --davidm 1/25/99 */
|
||||
|
||||
|
||||
for (str=buf ; *fmt ; ++fmt) {
|
||||
if (*fmt != '%') {
|
||||
*str++ = *fmt;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* process flags */
|
||||
flags = 0;
|
||||
repeat:
|
||||
++fmt; /* this also skips first '%' */
|
||||
switch (*fmt) {
|
||||
case '-': flags |= LEFT; goto repeat;
|
||||
case '+': flags |= PLUS; goto repeat;
|
||||
case ' ': flags |= SPACE; goto repeat;
|
||||
case '#': flags |= SPECIAL; goto repeat;
|
||||
case '0': flags |= ZEROPAD; goto repeat;
|
||||
}
|
||||
|
||||
/* get field width */
|
||||
field_width = -1;
|
||||
if ('0' <= *fmt && *fmt <= '9')
|
||||
field_width = skip_atoi(&fmt);
|
||||
else if (*fmt == '*') {
|
||||
++fmt;
|
||||
/* it's the next argument */
|
||||
field_width = va_arg(args, int);
|
||||
if (field_width < 0) {
|
||||
field_width = -field_width;
|
||||
flags |= LEFT;
|
||||
}
|
||||
}
|
||||
|
||||
/* get the precision */
|
||||
precision = -1;
|
||||
if (*fmt == '.') {
|
||||
++fmt;
|
||||
if ('0' <= *fmt && *fmt <= '9')
|
||||
precision = skip_atoi(&fmt);
|
||||
else if (*fmt == '*') {
|
||||
++fmt;
|
||||
/* it's the next argument */
|
||||
precision = va_arg(args, int);
|
||||
}
|
||||
if (precision < 0)
|
||||
precision = 0;
|
||||
}
|
||||
|
||||
/* get the conversion qualifier */
|
||||
qualifier = -1;
|
||||
if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L' || *fmt =='Z') {
|
||||
qualifier = *fmt;
|
||||
++fmt;
|
||||
}
|
||||
|
||||
/* default base */
|
||||
base = 10;
|
||||
|
||||
switch (*fmt) {
|
||||
case 'c':
|
||||
if (!(flags & LEFT))
|
||||
while (--field_width > 0)
|
||||
*str++ = ' ';
|
||||
*str++ = (unsigned char) va_arg(args, int);
|
||||
while (--field_width > 0)
|
||||
*str++ = ' ';
|
||||
continue;
|
||||
|
||||
case 's':
|
||||
s = va_arg(args, char *);
|
||||
if (!s)
|
||||
s = "<NULL>";
|
||||
|
||||
len = strnlen(s, precision);
|
||||
|
||||
if (!(flags & LEFT))
|
||||
while (len < field_width--)
|
||||
*str++ = ' ';
|
||||
for (i = 0; i < len; ++i)
|
||||
*str++ = *s++;
|
||||
while (len < field_width--)
|
||||
*str++ = ' ';
|
||||
continue;
|
||||
|
||||
case 'p':
|
||||
if (field_width == -1) {
|
||||
field_width = 2*sizeof(void *);
|
||||
flags |= ZEROPAD;
|
||||
}
|
||||
str = number(str,
|
||||
(unsigned long) va_arg(args, void *), 16,
|
||||
field_width, precision, flags);
|
||||
continue;
|
||||
|
||||
|
||||
case 'n':
|
||||
if (qualifier == 'l') {
|
||||
long * ip = va_arg(args, long *);
|
||||
*ip = (str - buf);
|
||||
} else if (qualifier == 'Z') {
|
||||
size_t * ip = va_arg(args, size_t *);
|
||||
*ip = (str - buf);
|
||||
} else {
|
||||
int * ip = va_arg(args, int *);
|
||||
*ip = (str - buf);
|
||||
}
|
||||
continue;
|
||||
|
||||
case '%':
|
||||
*str++ = '%';
|
||||
continue;
|
||||
|
||||
/* integer number formats - set up the flags and "break" */
|
||||
case 'o':
|
||||
base = 8;
|
||||
break;
|
||||
|
||||
case 'X':
|
||||
flags |= LARGE;
|
||||
case 'x':
|
||||
base = 16;
|
||||
break;
|
||||
|
||||
case 'd':
|
||||
case 'i':
|
||||
flags |= SIGN;
|
||||
case 'u':
|
||||
break;
|
||||
|
||||
default:
|
||||
*str++ = '%';
|
||||
if (*fmt)
|
||||
*str++ = *fmt;
|
||||
else
|
||||
--fmt;
|
||||
continue;
|
||||
}
|
||||
if (qualifier == 'l') {
|
||||
num = va_arg(args, unsigned long);
|
||||
if (flags & SIGN)
|
||||
num = (signed long) num;
|
||||
} else if (qualifier == 'Z') {
|
||||
num = va_arg(args, size_t);
|
||||
} else if (qualifier == 'h') {
|
||||
num = (unsigned short) va_arg(args, int);
|
||||
if (flags & SIGN)
|
||||
num = (signed short) num;
|
||||
} else {
|
||||
num = va_arg(args, unsigned int);
|
||||
if (flags & SIGN)
|
||||
num = (signed int) num;
|
||||
}
|
||||
str = number(str, num, base, field_width, precision, flags);
|
||||
}
|
||||
*str = '\0';
|
||||
return str-buf;
|
||||
}
|
||||
|
||||
int sprintf(char * buf, const char *fmt, ...)
|
||||
{
|
||||
va_list args;
|
||||
int i;
|
||||
|
||||
va_start(args, fmt);
|
||||
i=vsprintf(buf,fmt,args);
|
||||
va_end(args);
|
||||
return i;
|
||||
}
|
||||
|
||||
static char sprint_buf[1024];
|
||||
|
||||
int
|
||||
printf(const char *fmt, ...)
|
||||
{
|
||||
va_list args;
|
||||
int n;
|
||||
|
||||
va_start(args, fmt);
|
||||
n = vsprintf(sprint_buf, fmt, args);
|
||||
va_end(args);
|
||||
write(stdout, sprint_buf, n);
|
||||
return n;
|
||||
}
|
||||
@@ -7,10 +7,4 @@ extern int sprintf(char *buf, const char *fmt, ...);
|
||||
|
||||
extern int vsprintf(char *buf, const char *fmt, va_list args);
|
||||
|
||||
extern int putc(int c, void *f);
|
||||
extern int putchar(int c);
|
||||
extern int getchar(void);
|
||||
|
||||
extern int fputs(char *str, void *f);
|
||||
|
||||
#endif /* _PPC_BOOT_STDIO_H_ */
|
||||
|
||||
@@ -107,10 +107,12 @@ memcpy:
|
||||
rlwinm. r7,r5,32-3,3,31 /* r7 = r5 >> 3 */
|
||||
addi r6,r3,-4
|
||||
addi r4,r4,-4
|
||||
beq 2f /* if less than 8 bytes to do */
|
||||
beq 3f /* if less than 8 bytes to do */
|
||||
andi. r0,r6,3 /* get dest word aligned */
|
||||
mtctr r7
|
||||
bne 5f
|
||||
andi. r0,r4,3 /* check src word aligned too */
|
||||
bne 3f
|
||||
1: lwz r7,4(r4)
|
||||
lwzu r8,8(r4)
|
||||
stw r7,4(r6)
|
||||
@@ -132,6 +134,11 @@ memcpy:
|
||||
bdnz 4b
|
||||
blr
|
||||
5: subfic r0,r0,4
|
||||
cmpw cr1,r0,r5
|
||||
add r7,r0,r4
|
||||
andi. r7,r7,3 /* will source be word-aligned too? */
|
||||
ble cr1,3b
|
||||
bne 3b /* do byte-by-byte if not */
|
||||
mtctr r0
|
||||
6: lbz r7,4(r4)
|
||||
addi r4,r4,1
|
||||
@@ -149,10 +156,12 @@ backwards_memcpy:
|
||||
rlwinm. r7,r5,32-3,3,31 /* r7 = r5 >> 3 */
|
||||
add r6,r3,r5
|
||||
add r4,r4,r5
|
||||
beq 2f
|
||||
beq 3f
|
||||
andi. r0,r6,3
|
||||
mtctr r7
|
||||
bne 5f
|
||||
andi. r0,r4,3
|
||||
bne 3f
|
||||
1: lwz r7,-4(r4)
|
||||
lwzu r8,-8(r4)
|
||||
stw r7,-4(r6)
|
||||
@@ -171,7 +180,12 @@ backwards_memcpy:
|
||||
stbu r0,-1(r6)
|
||||
bdnz 4b
|
||||
blr
|
||||
5: mtctr r0
|
||||
5: cmpw cr1,r0,r5
|
||||
subf r7,r0,r4
|
||||
andi. r7,r7,3
|
||||
ble cr1,3b
|
||||
bne 3b
|
||||
mtctr r0
|
||||
6: lbzu r7,-1(r4)
|
||||
stbu r7,-1(r6)
|
||||
bdnz 6b
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
OUTPUT_ARCH(powerpc:common)
|
||||
ENTRY(_start)
|
||||
SECTIONS
|
||||
{
|
||||
. = (5*1024*1024);
|
||||
_start = .;
|
||||
.text :
|
||||
{
|
||||
*(.text)
|
||||
*(.fixup)
|
||||
}
|
||||
_etext = .;
|
||||
. = ALIGN(4096);
|
||||
.data :
|
||||
{
|
||||
*(.rodata*)
|
||||
*(.data*)
|
||||
*(.sdata*)
|
||||
__got2_start = .;
|
||||
*(.got2)
|
||||
__got2_end = .;
|
||||
|
||||
_vmlinux_start = .;
|
||||
*(.kernel:vmlinux.strip)
|
||||
_vmlinux_end = .;
|
||||
|
||||
_initrd_start = .;
|
||||
*(.kernel:initrd)
|
||||
_initrd_end = .;
|
||||
}
|
||||
|
||||
. = ALIGN(4096);
|
||||
_edata = .;
|
||||
__bss_start = .;
|
||||
.bss :
|
||||
{
|
||||
*(.sbss)
|
||||
*(.bss)
|
||||
}
|
||||
_end = . ;
|
||||
|
||||
/DISCARD/ :
|
||||
{
|
||||
*(.comment)
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -135,7 +135,7 @@ int main(void)
|
||||
DEFINE(PACA_EXMC, offsetof(struct paca_struct, exmc));
|
||||
DEFINE(PACA_EXSLB, offsetof(struct paca_struct, exslb));
|
||||
DEFINE(PACAEMERGSP, offsetof(struct paca_struct, emergency_sp));
|
||||
DEFINE(PACALPPACA, offsetof(struct paca_struct, lppaca));
|
||||
DEFINE(PACALPPACAPTR, offsetof(struct paca_struct, lppaca_ptr));
|
||||
DEFINE(PACAHWCPUID, offsetof(struct paca_struct, hw_cpu_id));
|
||||
|
||||
DEFINE(LPPACASRR0, offsetof(struct lppaca, saved_srr0));
|
||||
|
||||
@@ -130,7 +130,7 @@ _GLOBAL(__save_cpu_setup)
|
||||
mfcr r7
|
||||
|
||||
/* Get storage ptr */
|
||||
LOADADDR(r5,cpu_state_storage)
|
||||
LOAD_REG_IMMEDIATE(r5,cpu_state_storage)
|
||||
|
||||
/* We only deal with 970 for now */
|
||||
mfspr r0,SPRN_PVR
|
||||
@@ -164,7 +164,7 @@ _GLOBAL(__restore_cpu_setup)
|
||||
/* Get storage ptr (FIXME when using anton reloc as we
|
||||
* are running with translation disabled here
|
||||
*/
|
||||
LOADADDR(r5,cpu_state_storage)
|
||||
LOAD_REG_IMMEDIATE(r5,cpu_state_storage)
|
||||
|
||||
/* We only deal with 970 for now */
|
||||
mfspr r0,SPRN_PVR
|
||||
|
||||
+154
-70
File diff suppressed because it is too large
Load Diff
@@ -988,7 +988,7 @@ _GLOBAL(enter_rtas)
|
||||
stwu r1,-INT_FRAME_SIZE(r1)
|
||||
mflr r0
|
||||
stw r0,INT_FRAME_SIZE+4(r1)
|
||||
LOADADDR(r4, rtas)
|
||||
LOAD_REG_ADDR(r4, rtas)
|
||||
lis r6,1f@ha /* physical return address for rtas */
|
||||
addi r6,r6,1f@l
|
||||
tophys(r6,r6)
|
||||
|
||||
@@ -511,7 +511,8 @@ restore:
|
||||
cmpdi 0,r5,0
|
||||
beq 4f
|
||||
/* Check for pending interrupts (iSeries) */
|
||||
ld r3,PACALPPACA+LPPACAANYINT(r13)
|
||||
ld r3,PACALPPACAPTR(r13)
|
||||
ld r3,LPPACAANYINT(r3)
|
||||
cmpdi r3,0
|
||||
beq+ 4f /* skip do_IRQ if no interrupts */
|
||||
|
||||
@@ -689,9 +690,8 @@ _GLOBAL(enter_rtas)
|
||||
std r6,PACASAVEDMSR(r13)
|
||||
|
||||
/* Setup our real return addr */
|
||||
SET_REG_TO_LABEL(r4,.rtas_return_loc)
|
||||
SET_REG_TO_CONST(r9,PAGE_OFFSET)
|
||||
sub r4,r4,r9
|
||||
LOAD_REG_ADDR(r4,.rtas_return_loc)
|
||||
clrldi r4,r4,2 /* convert to realmode address */
|
||||
mtlr r4
|
||||
|
||||
li r0,0
|
||||
@@ -706,7 +706,7 @@ _GLOBAL(enter_rtas)
|
||||
sync /* disable interrupts so SRR0/1 */
|
||||
mtmsrd r0 /* don't get trashed */
|
||||
|
||||
SET_REG_TO_LABEL(r4,rtas)
|
||||
LOAD_REG_ADDR(r4, rtas)
|
||||
ld r5,RTASENTRY(r4) /* get the rtas->entry value */
|
||||
ld r4,RTASBASE(r4) /* get the rtas->base value */
|
||||
|
||||
@@ -718,8 +718,7 @@ _GLOBAL(enter_rtas)
|
||||
_STATIC(rtas_return_loc)
|
||||
/* relocation is off at this point */
|
||||
mfspr r4,SPRN_SPRG3 /* Get PACA */
|
||||
SET_REG_TO_CONST(r5, PAGE_OFFSET)
|
||||
sub r4,r4,r5 /* RELOC the PACA base pointer */
|
||||
clrldi r4,r4,2 /* convert to realmode address */
|
||||
|
||||
mfmsr r6
|
||||
li r0,MSR_RI
|
||||
@@ -728,7 +727,7 @@ _STATIC(rtas_return_loc)
|
||||
mtmsrd r6
|
||||
|
||||
ld r1,PACAR1(r4) /* Restore our SP */
|
||||
LOADADDR(r3,.rtas_restore_regs)
|
||||
LOAD_REG_IMMEDIATE(r3,.rtas_restore_regs)
|
||||
ld r4,PACASAVEDMSR(r4) /* Restore our MSR */
|
||||
|
||||
mtspr SPRN_SRR0,r3
|
||||
|
||||
@@ -39,9 +39,9 @@ _GLOBAL(load_up_fpu)
|
||||
* to another. Instead we call giveup_fpu in switch_to.
|
||||
*/
|
||||
#ifndef CONFIG_SMP
|
||||
LOADBASE(r3, last_task_used_math)
|
||||
LOAD_REG_ADDRBASE(r3, last_task_used_math)
|
||||
toreal(r3)
|
||||
PPC_LL r4,OFF(last_task_used_math)(r3)
|
||||
PPC_LL r4,ADDROFF(last_task_used_math)(r3)
|
||||
PPC_LCMPI 0,r4,0
|
||||
beq 1f
|
||||
toreal(r4)
|
||||
@@ -77,7 +77,7 @@ _GLOBAL(load_up_fpu)
|
||||
#ifndef CONFIG_SMP
|
||||
subi r4,r5,THREAD
|
||||
fromreal(r4)
|
||||
PPC_STL r4,OFF(last_task_used_math)(r3)
|
||||
PPC_STL r4,ADDROFF(last_task_used_math)(r3)
|
||||
#endif /* CONFIG_SMP */
|
||||
/* restore registers and return */
|
||||
/* we haven't used ctr or xer or lr */
|
||||
@@ -113,8 +113,8 @@ _GLOBAL(giveup_fpu)
|
||||
1:
|
||||
#ifndef CONFIG_SMP
|
||||
li r5,0
|
||||
LOADBASE(r4,last_task_used_math)
|
||||
PPC_STL r5,OFF(last_task_used_math)(r4)
|
||||
LOAD_REG_ADDRBASE(r4,last_task_used_math)
|
||||
PPC_STL r5,ADDROFF(last_task_used_math)(r4)
|
||||
#endif /* CONFIG_SMP */
|
||||
blr
|
||||
|
||||
|
||||
@@ -154,12 +154,12 @@ _GLOBAL(__secondary_hold)
|
||||
bne 100b
|
||||
|
||||
#ifdef CONFIG_HMT
|
||||
LOADADDR(r4, .hmt_init)
|
||||
SET_REG_IMMEDIATE(r4, .hmt_init)
|
||||
mtctr r4
|
||||
bctr
|
||||
#else
|
||||
#ifdef CONFIG_SMP
|
||||
LOADADDR(r4, .pSeries_secondary_smp_init)
|
||||
LOAD_REG_IMMEDIATE(r4, .pSeries_secondary_smp_init)
|
||||
mtctr r4
|
||||
mr r3,r24
|
||||
bctr
|
||||
@@ -205,9 +205,10 @@ exception_marker:
|
||||
#define EX_LR 72
|
||||
|
||||
/*
|
||||
* We're short on space and time in the exception prolog, so we can't use
|
||||
* the normal LOADADDR macro. Normally we just need the low halfword of the
|
||||
* address, but for Kdump we need the whole low word.
|
||||
* We're short on space and time in the exception prolog, so we can't
|
||||
* use the normal SET_REG_IMMEDIATE macro. Normally we just need the
|
||||
* low halfword of the address, but for Kdump we need the whole low
|
||||
* word.
|
||||
*/
|
||||
#ifdef CONFIG_CRASH_DUMP
|
||||
#define LOAD_HANDLER(reg, label) \
|
||||
@@ -254,8 +255,9 @@ exception_marker:
|
||||
|
||||
#define EXCEPTION_PROLOG_ISERIES_2 \
|
||||
mfmsr r10; \
|
||||
ld r11,PACALPPACA+LPPACASRR0(r13); \
|
||||
ld r12,PACALPPACA+LPPACASRR1(r13); \
|
||||
ld r12,PACALPPACAPTR(r13); \
|
||||
ld r11,LPPACASRR0(r12); \
|
||||
ld r12,LPPACASRR1(r12); \
|
||||
ori r10,r10,MSR_RI; \
|
||||
mtmsrd r10,1
|
||||
|
||||
@@ -634,7 +636,8 @@ data_access_slb_iSeries:
|
||||
std r12,PACA_EXSLB+EX_R12(r13)
|
||||
mfspr r10,SPRN_SPRG1
|
||||
std r10,PACA_EXSLB+EX_R13(r13)
|
||||
ld r12,PACALPPACA+LPPACASRR1(r13);
|
||||
ld r12,PACALPPACAPTR(r13)
|
||||
ld r12,LPPACASRR1(r12)
|
||||
b .slb_miss_realmode
|
||||
|
||||
STD_EXCEPTION_ISERIES(0x400, instruction_access, PACA_EXGEN)
|
||||
@@ -644,7 +647,8 @@ instruction_access_slb_iSeries:
|
||||
mtspr SPRN_SPRG1,r13 /* save r13 */
|
||||
mfspr r13,SPRN_SPRG3 /* get paca address into r13 */
|
||||
std r3,PACA_EXSLB+EX_R3(r13)
|
||||
ld r3,PACALPPACA+LPPACASRR0(r13) /* get SRR0 value */
|
||||
ld r3,PACALPPACAPTR(r13)
|
||||
ld r3,LPPACASRR0(r3) /* get SRR0 value */
|
||||
std r9,PACA_EXSLB+EX_R9(r13)
|
||||
mfcr r9
|
||||
#ifdef __DISABLED__
|
||||
@@ -656,7 +660,8 @@ instruction_access_slb_iSeries:
|
||||
std r12,PACA_EXSLB+EX_R12(r13)
|
||||
mfspr r10,SPRN_SPRG1
|
||||
std r10,PACA_EXSLB+EX_R13(r13)
|
||||
ld r12,PACALPPACA+LPPACASRR1(r13);
|
||||
ld r12,PACALPPACAPTR(r13)
|
||||
ld r12,LPPACASRR1(r12)
|
||||
b .slb_miss_realmode
|
||||
|
||||
#ifdef __DISABLED__
|
||||
@@ -713,7 +718,7 @@ system_reset_iSeries:
|
||||
lbz r23,PACAPROCSTART(r13) /* Test if this processor
|
||||
* should start */
|
||||
sync
|
||||
LOADADDR(r3,current_set)
|
||||
LOAD_REG_IMMEDIATE(r3,current_set)
|
||||
sldi r28,r24,3 /* get current_set[cpu#] */
|
||||
ldx r3,r3,r28
|
||||
addi r1,r3,THREAD_SIZE
|
||||
@@ -745,17 +750,19 @@ iSeries_secondary_smp_loop:
|
||||
.globl decrementer_iSeries_masked
|
||||
decrementer_iSeries_masked:
|
||||
li r11,1
|
||||
stb r11,PACALPPACA+LPPACADECRINT(r13)
|
||||
LOADBASE(r12,tb_ticks_per_jiffy)
|
||||
lwz r12,OFF(tb_ticks_per_jiffy)(r12)
|
||||
ld r12,PACALPPACAPTR(r13)
|
||||
stb r11,LPPACADECRINT(r12)
|
||||
LOAD_REG_ADDRBASE(r12,tb_ticks_per_jiffy)
|
||||
lwz r12,ADDROFF(tb_ticks_per_jiffy)(r12)
|
||||
mtspr SPRN_DEC,r12
|
||||
/* fall through */
|
||||
|
||||
.globl hardware_interrupt_iSeries_masked
|
||||
hardware_interrupt_iSeries_masked:
|
||||
mtcrf 0x80,r9 /* Restore regs */
|
||||
ld r11,PACALPPACA+LPPACASRR0(r13)
|
||||
ld r12,PACALPPACA+LPPACASRR1(r13)
|
||||
ld r12,PACALPPACAPTR(r13)
|
||||
ld r11,LPPACASRR0(r12)
|
||||
ld r12,LPPACASRR1(r12)
|
||||
mtspr SPRN_SRR0,r11
|
||||
mtspr SPRN_SRR1,r12
|
||||
ld r9,PACA_EXGEN+EX_R9(r13)
|
||||
@@ -994,7 +1001,8 @@ _GLOBAL(slb_miss_realmode)
|
||||
ld r3,PACA_EXSLB+EX_R3(r13)
|
||||
lwz r9,PACA_EXSLB+EX_CCR(r13) /* get saved CR */
|
||||
#ifdef CONFIG_PPC_ISERIES
|
||||
ld r11,PACALPPACA+LPPACASRR0(r13) /* get SRR0 value */
|
||||
ld r11,PACALPPACAPTR(r13)
|
||||
ld r11,LPPACASRR0(r11) /* get SRR0 value */
|
||||
#endif /* CONFIG_PPC_ISERIES */
|
||||
|
||||
mtlr r10
|
||||
@@ -1412,7 +1420,7 @@ _GLOBAL(pSeries_secondary_smp_init)
|
||||
* physical cpu id in r24, we need to search the pacas to find
|
||||
* which logical id maps to our physical one.
|
||||
*/
|
||||
LOADADDR(r13, paca) /* Get base vaddr of paca array */
|
||||
LOAD_REG_IMMEDIATE(r13, paca) /* Get base vaddr of paca array */
|
||||
li r5,0 /* logical cpu id */
|
||||
1: lhz r6,PACAHWCPUID(r13) /* Load HW procid from paca */
|
||||
cmpw r6,r24 /* Compare to our id */
|
||||
@@ -1446,8 +1454,8 @@ _GLOBAL(pSeries_secondary_smp_init)
|
||||
#ifdef CONFIG_PPC_ISERIES
|
||||
_STATIC(__start_initialization_iSeries)
|
||||
/* Clear out the BSS */
|
||||
LOADADDR(r11,__bss_stop)
|
||||
LOADADDR(r8,__bss_start)
|
||||
LOAD_REG_IMMEDIATE(r11,__bss_stop)
|
||||
LOAD_REG_IMMEDIATE(r8,__bss_start)
|
||||
sub r11,r11,r8 /* bss size */
|
||||
addi r11,r11,7 /* round up to an even double word */
|
||||
rldicl. r11,r11,61,3 /* shift right by 3 */
|
||||
@@ -1458,17 +1466,17 @@ _STATIC(__start_initialization_iSeries)
|
||||
3: stdu r0,8(r8)
|
||||
bdnz 3b
|
||||
4:
|
||||
LOADADDR(r1,init_thread_union)
|
||||
LOAD_REG_IMMEDIATE(r1,init_thread_union)
|
||||
addi r1,r1,THREAD_SIZE
|
||||
li r0,0
|
||||
stdu r0,-STACK_FRAME_OVERHEAD(r1)
|
||||
|
||||
LOADADDR(r3,cpu_specs)
|
||||
LOADADDR(r4,cur_cpu_spec)
|
||||
LOAD_REG_IMMEDIATE(r3,cpu_specs)
|
||||
LOAD_REG_IMMEDIATE(r4,cur_cpu_spec)
|
||||
li r5,0
|
||||
bl .identify_cpu
|
||||
|
||||
LOADADDR(r2,__toc_start)
|
||||
LOAD_REG_IMMEDIATE(r2,__toc_start)
|
||||
addi r2,r2,0x4000
|
||||
addi r2,r2,0x4000
|
||||
|
||||
@@ -1528,7 +1536,7 @@ _GLOBAL(__start_initialization_multiplatform)
|
||||
li r24,0
|
||||
|
||||
/* Switch off MMU if not already */
|
||||
LOADADDR(r4, .__after_prom_start - KERNELBASE)
|
||||
LOAD_REG_IMMEDIATE(r4, .__after_prom_start - KERNELBASE)
|
||||
add r4,r4,r30
|
||||
bl .__mmu_off
|
||||
b .__after_prom_start
|
||||
@@ -1548,7 +1556,7 @@ _STATIC(__boot_from_prom)
|
||||
/* put a relocation offset into r3 */
|
||||
bl .reloc_offset
|
||||
|
||||
LOADADDR(r2,__toc_start)
|
||||
LOAD_REG_IMMEDIATE(r2,__toc_start)
|
||||
addi r2,r2,0x4000
|
||||
addi r2,r2,0x4000
|
||||
|
||||
@@ -1588,9 +1596,9 @@ _STATIC(__after_prom_start)
|
||||
*/
|
||||
bl .reloc_offset
|
||||
mr r26,r3
|
||||
SET_REG_TO_CONST(r27,KERNELBASE)
|
||||
LOAD_REG_IMMEDIATE(r27, KERNELBASE)
|
||||
|
||||
LOADADDR(r3, PHYSICAL_START) /* target addr */
|
||||
LOAD_REG_IMMEDIATE(r3, PHYSICAL_START) /* target addr */
|
||||
|
||||
// XXX FIXME: Use phys returned by OF (r30)
|
||||
add r4,r27,r26 /* source addr */
|
||||
@@ -1598,7 +1606,7 @@ _STATIC(__after_prom_start)
|
||||
/* i.e. where we are running */
|
||||
/* the source addr */
|
||||
|
||||
LOADADDR(r5,copy_to_here) /* # bytes of memory to copy */
|
||||
LOAD_REG_IMMEDIATE(r5,copy_to_here) /* # bytes of memory to copy */
|
||||
sub r5,r5,r27
|
||||
|
||||
li r6,0x100 /* Start offset, the first 0x100 */
|
||||
@@ -1608,11 +1616,11 @@ _STATIC(__after_prom_start)
|
||||
/* this includes the code being */
|
||||
/* executed here. */
|
||||
|
||||
LOADADDR(r0, 4f) /* Jump to the copy of this code */
|
||||
LOAD_REG_IMMEDIATE(r0, 4f) /* Jump to the copy of this code */
|
||||
mtctr r0 /* that we just made/relocated */
|
||||
bctr
|
||||
|
||||
4: LOADADDR(r5,klimit)
|
||||
4: LOAD_REG_IMMEDIATE(r5,klimit)
|
||||
add r5,r5,r26
|
||||
ld r5,0(r5) /* get the value of klimit */
|
||||
sub r5,r5,r27
|
||||
@@ -1694,7 +1702,7 @@ _GLOBAL(pmac_secondary_start)
|
||||
mtmsrd r3 /* RI on */
|
||||
|
||||
/* Set up a paca value for this processor. */
|
||||
LOADADDR(r4, paca) /* Get base vaddr of paca array */
|
||||
LOAD_REG_IMMEDIATE(r4, paca) /* Get base vaddr of paca array */
|
||||
mulli r13,r24,PACA_SIZE /* Calculate vaddr of right paca */
|
||||
add r13,r13,r4 /* for this processor. */
|
||||
mtspr SPRN_SPRG3,r13 /* Save vaddr of paca in SPRG3 */
|
||||
@@ -1731,7 +1739,7 @@ _GLOBAL(__secondary_start)
|
||||
bl .early_setup_secondary
|
||||
|
||||
/* Initialize the kernel stack. Just a repeat for iSeries. */
|
||||
LOADADDR(r3,current_set)
|
||||
LOAD_REG_ADDR(r3, current_set)
|
||||
sldi r28,r24,3 /* get current_set[cpu#] */
|
||||
ldx r1,r3,r28
|
||||
addi r1,r1,THREAD_SIZE-STACK_FRAME_OVERHEAD
|
||||
@@ -1742,8 +1750,8 @@ _GLOBAL(__secondary_start)
|
||||
mtlr r7
|
||||
|
||||
/* enable MMU and jump to start_secondary */
|
||||
LOADADDR(r3,.start_secondary_prolog)
|
||||
SET_REG_TO_CONST(r4, MSR_KERNEL)
|
||||
LOAD_REG_ADDR(r3, .start_secondary_prolog)
|
||||
LOAD_REG_IMMEDIATE(r4, MSR_KERNEL)
|
||||
#ifdef DO_SOFT_DISABLE
|
||||
ori r4,r4,MSR_EE
|
||||
#endif
|
||||
@@ -1792,8 +1800,8 @@ _STATIC(start_here_multiplatform)
|
||||
* be detached from the kernel completely. Besides, we need
|
||||
* to clear it now for kexec-style entry.
|
||||
*/
|
||||
LOADADDR(r11,__bss_stop)
|
||||
LOADADDR(r8,__bss_start)
|
||||
LOAD_REG_IMMEDIATE(r11,__bss_stop)
|
||||
LOAD_REG_IMMEDIATE(r8,__bss_start)
|
||||
sub r11,r11,r8 /* bss size */
|
||||
addi r11,r11,7 /* round up to an even double word */
|
||||
rldicl. r11,r11,61,3 /* shift right by 3 */
|
||||
@@ -1831,7 +1839,7 @@ _STATIC(start_here_multiplatform)
|
||||
/* up the htab. This is done because we have relocated the */
|
||||
/* kernel but are still running in real mode. */
|
||||
|
||||
LOADADDR(r3,init_thread_union)
|
||||
LOAD_REG_IMMEDIATE(r3,init_thread_union)
|
||||
add r3,r3,r26
|
||||
|
||||
/* set up a stack pointer (physical address) */
|
||||
@@ -1840,14 +1848,14 @@ _STATIC(start_here_multiplatform)
|
||||
stdu r0,-STACK_FRAME_OVERHEAD(r1)
|
||||
|
||||
/* set up the TOC (physical address) */
|
||||
LOADADDR(r2,__toc_start)
|
||||
LOAD_REG_IMMEDIATE(r2,__toc_start)
|
||||
addi r2,r2,0x4000
|
||||
addi r2,r2,0x4000
|
||||
add r2,r2,r26
|
||||
|
||||
LOADADDR(r3,cpu_specs)
|
||||
LOAD_REG_IMMEDIATE(r3, cpu_specs)
|
||||
add r3,r3,r26
|
||||
LOADADDR(r4,cur_cpu_spec)
|
||||
LOAD_REG_IMMEDIATE(r4,cur_cpu_spec)
|
||||
add r4,r4,r26
|
||||
mr r5,r26
|
||||
bl .identify_cpu
|
||||
@@ -1863,11 +1871,11 @@ _STATIC(start_here_multiplatform)
|
||||
* nowhere it can be initialized differently before we reach this
|
||||
* code
|
||||
*/
|
||||
LOADADDR(r27, boot_cpuid)
|
||||
LOAD_REG_IMMEDIATE(r27, boot_cpuid)
|
||||
add r27,r27,r26
|
||||
lwz r27,0(r27)
|
||||
|
||||
LOADADDR(r24, paca) /* Get base vaddr of paca array */
|
||||
LOAD_REG_IMMEDIATE(r24, paca) /* Get base vaddr of paca array */
|
||||
mulli r13,r27,PACA_SIZE /* Calculate vaddr of right paca */
|
||||
add r13,r13,r24 /* for this processor. */
|
||||
add r13,r13,r26 /* convert to physical addr */
|
||||
@@ -1880,8 +1888,8 @@ _STATIC(start_here_multiplatform)
|
||||
mr r3,r31
|
||||
bl .early_setup
|
||||
|
||||
LOADADDR(r3,.start_here_common)
|
||||
SET_REG_TO_CONST(r4, MSR_KERNEL)
|
||||
LOAD_REG_IMMEDIATE(r3, .start_here_common)
|
||||
LOAD_REG_IMMEDIATE(r4, MSR_KERNEL)
|
||||
mtspr SPRN_SRR0,r3
|
||||
mtspr SPRN_SRR1,r4
|
||||
rfid
|
||||
@@ -1895,7 +1903,7 @@ _STATIC(start_here_common)
|
||||
/* The following code sets up the SP and TOC now that we are */
|
||||
/* running with translation enabled. */
|
||||
|
||||
LOADADDR(r3,init_thread_union)
|
||||
LOAD_REG_IMMEDIATE(r3,init_thread_union)
|
||||
|
||||
/* set up the stack */
|
||||
addi r1,r3,THREAD_SIZE
|
||||
@@ -1908,16 +1916,16 @@ _STATIC(start_here_common)
|
||||
li r3,0
|
||||
bl .do_cpu_ftr_fixups
|
||||
|
||||
LOADADDR(r26, boot_cpuid)
|
||||
LOAD_REG_IMMEDIATE(r26, boot_cpuid)
|
||||
lwz r26,0(r26)
|
||||
|
||||
LOADADDR(r24, paca) /* Get base vaddr of paca array */
|
||||
LOAD_REG_IMMEDIATE(r24, paca) /* Get base vaddr of paca array */
|
||||
mulli r13,r26,PACA_SIZE /* Calculate vaddr of right paca */
|
||||
add r13,r13,r24 /* for this processor. */
|
||||
mtspr SPRN_SPRG3,r13
|
||||
|
||||
/* ptr to current */
|
||||
LOADADDR(r4,init_task)
|
||||
LOAD_REG_IMMEDIATE(r4, init_task)
|
||||
std r4,PACACURRENT(r13)
|
||||
|
||||
/* Load the TOC */
|
||||
@@ -1940,7 +1948,7 @@ _STATIC(start_here_common)
|
||||
|
||||
_GLOBAL(hmt_init)
|
||||
#ifdef CONFIG_HMT
|
||||
LOADADDR(r5, hmt_thread_data)
|
||||
LOAD_REG_IMMEDIATE(r5, hmt_thread_data)
|
||||
mfspr r7,SPRN_PVR
|
||||
srwi r7,r7,16
|
||||
cmpwi r7,0x34 /* Pulsar */
|
||||
@@ -1961,7 +1969,7 @@ _GLOBAL(hmt_init)
|
||||
b 101f
|
||||
|
||||
__hmt_secondary_hold:
|
||||
LOADADDR(r5, hmt_thread_data)
|
||||
LOAD_REG_IMMEDIATE(r5, hmt_thread_data)
|
||||
clrldi r5,r5,4
|
||||
li r7,0
|
||||
mfspr r6,SPRN_PIR
|
||||
@@ -1989,7 +1997,7 @@ __hmt_secondary_hold:
|
||||
|
||||
#ifdef CONFIG_HMT
|
||||
_GLOBAL(hmt_start_secondary)
|
||||
LOADADDR(r4,__hmt_secondary_hold)
|
||||
LOAD_REG_IMMEDIATE(r4,__hmt_secondary_hold)
|
||||
clrldi r4,r4,4
|
||||
mtspr SPRN_NIADORM, r4
|
||||
mfspr r4, SPRN_MSRDORM
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user