Commit decd300b30e499fe6be1bbfc5650fc971de8c1fa
Committed by
Paul Mackerras
1 parent
02b3e4e2d7
Exists in
master
and in
4 other branches
[PATCH] ppc64: make arch/ppc64/boot standalone
Make the bootheader for ppc64 independent from kernel and libc headers. * add -nostdinc -isystem $gccincludes to not include libc headers * declare all functions in header files, also the stuff from string.S * declare some functions static * use stddef.h to get size_t (hopefully ok) * remove ppc32-types.h, only elf.h used the __NN types With further modifications by Paul Mackerras and Stephen Rothwell. Signed-off-by: Olaf Hering <olh@suse.de> Signed-off-by: Paul Mackerras <paulus@samba.org>
Showing 15 changed files with 350 additions and 248 deletions Side-by-side Diff
- arch/ppc64/boot/Makefile
- arch/ppc64/boot/addnote.c
- arch/ppc64/boot/crt0.S
- arch/ppc64/boot/div64.S
- arch/ppc64/boot/elf.h
- arch/ppc64/boot/main.c
- arch/ppc64/boot/page.h
- arch/ppc64/boot/ppc32-types.h
- arch/ppc64/boot/ppc_asm.h
- arch/ppc64/boot/prom.c
- arch/ppc64/boot/prom.h
- arch/ppc64/boot/stdio.h
- arch/ppc64/boot/string.S
- arch/ppc64/boot/string.h
- arch/ppc64/boot/zlib.c
arch/ppc64/boot/Makefile
| ... | ... | @@ -22,8 +22,8 @@ |
| 22 | 22 | |
| 23 | 23 | |
| 24 | 24 | HOSTCC := gcc |
| 25 | -BOOTCFLAGS := $(HOSTCFLAGS) $(LINUXINCLUDE) -fno-builtin | |
| 26 | -BOOTAFLAGS := -D__ASSEMBLY__ $(BOOTCFLAGS) -traditional | |
| 25 | +BOOTCFLAGS := $(HOSTCFLAGS) -fno-builtin -nostdinc -isystem $(shell $(CROSS32CC) -print-file-name=include) | |
| 26 | +BOOTAFLAGS := -D__ASSEMBLY__ $(BOOTCFLAGS) -traditional -nostdinc | |
| 27 | 27 | BOOTLFLAGS := -Ttext 0x00400000 -e _start -T $(srctree)/$(src)/zImage.lds |
| 28 | 28 | OBJCOPYFLAGS := contents,alloc,load,readonly,data |
| 29 | 29 |
arch/ppc64/boot/addnote.c
| ... | ... | @@ -157,7 +157,7 @@ |
| 157 | 157 | PUT_32BE(ns, strlen(arch) + 1); |
| 158 | 158 | PUT_32BE(ns + 4, N_DESCR * 4); |
| 159 | 159 | PUT_32BE(ns + 8, 0x1275); |
| 160 | - strcpy(&buf[ns + 12], arch); | |
| 160 | + strcpy((char *) &buf[ns + 12], arch); | |
| 161 | 161 | ns += 12 + strlen(arch) + 1; |
| 162 | 162 | for (i = 0; i < N_DESCR; ++i, ns += 4) |
| 163 | 163 | PUT_32BE(ns, descr[i]); |
| ... | ... | @@ -172,7 +172,7 @@ |
| 172 | 172 | PUT_32BE(ns, strlen(rpaname) + 1); |
| 173 | 173 | PUT_32BE(ns + 4, sizeof(rpanote)); |
| 174 | 174 | PUT_32BE(ns + 8, 0x12759999); |
| 175 | - strcpy(&buf[ns + 12], rpaname); | |
| 175 | + strcpy((char *) &buf[ns + 12], rpaname); | |
| 176 | 176 | ns += 12 + ROUNDUP(strlen(rpaname) + 1); |
| 177 | 177 | for (i = 0; i < N_RPA_DESCR; ++i, ns += 4) |
| 178 | 178 | PUT_32BE(ns, rpanote[i]); |
arch/ppc64/boot/crt0.S
arch/ppc64/boot/div64.S
arch/ppc64/boot/elf.h
| 1 | +#ifndef _PPC_BOOT_ELF_H_ | |
| 2 | +#define _PPC_BOOT_ELF_H_ | |
| 3 | + | |
| 4 | +/* 32-bit ELF base types. */ | |
| 5 | +typedef unsigned int Elf32_Addr; | |
| 6 | +typedef unsigned short Elf32_Half; | |
| 7 | +typedef unsigned int Elf32_Off; | |
| 8 | +typedef signed int Elf32_Sword; | |
| 9 | +typedef unsigned int Elf32_Word; | |
| 10 | + | |
| 11 | +/* 64-bit ELF base types. */ | |
| 12 | +typedef unsigned long long Elf64_Addr; | |
| 13 | +typedef unsigned short Elf64_Half; | |
| 14 | +typedef signed short Elf64_SHalf; | |
| 15 | +typedef unsigned long long Elf64_Off; | |
| 16 | +typedef signed int Elf64_Sword; | |
| 17 | +typedef unsigned int Elf64_Word; | |
| 18 | +typedef unsigned long long Elf64_Xword; | |
| 19 | +typedef signed long long Elf64_Sxword; | |
| 20 | + | |
| 21 | +/* These constants are for the segment types stored in the image headers */ | |
| 22 | +#define PT_NULL 0 | |
| 23 | +#define PT_LOAD 1 | |
| 24 | +#define PT_DYNAMIC 2 | |
| 25 | +#define PT_INTERP 3 | |
| 26 | +#define PT_NOTE 4 | |
| 27 | +#define PT_SHLIB 5 | |
| 28 | +#define PT_PHDR 6 | |
| 29 | +#define PT_TLS 7 /* Thread local storage segment */ | |
| 30 | +#define PT_LOOS 0x60000000 /* OS-specific */ | |
| 31 | +#define PT_HIOS 0x6fffffff /* OS-specific */ | |
| 32 | +#define PT_LOPROC 0x70000000 | |
| 33 | +#define PT_HIPROC 0x7fffffff | |
| 34 | +#define PT_GNU_EH_FRAME 0x6474e550 | |
| 35 | + | |
| 36 | +#define PT_GNU_STACK (PT_LOOS + 0x474e551) | |
| 37 | + | |
| 38 | +/* These constants define the different elf file types */ | |
| 39 | +#define ET_NONE 0 | |
| 40 | +#define ET_REL 1 | |
| 41 | +#define ET_EXEC 2 | |
| 42 | +#define ET_DYN 3 | |
| 43 | +#define ET_CORE 4 | |
| 44 | +#define ET_LOPROC 0xff00 | |
| 45 | +#define ET_HIPROC 0xffff | |
| 46 | + | |
| 47 | +/* These constants define the various ELF target machines */ | |
| 48 | +#define EM_NONE 0 | |
| 49 | +#define EM_PPC 20 /* PowerPC */ | |
| 50 | +#define EM_PPC64 21 /* PowerPC64 */ | |
| 51 | + | |
| 52 | +#define EI_NIDENT 16 | |
| 53 | + | |
| 54 | +typedef struct elf32_hdr { | |
| 55 | + unsigned char e_ident[EI_NIDENT]; | |
| 56 | + Elf32_Half e_type; | |
| 57 | + Elf32_Half e_machine; | |
| 58 | + Elf32_Word e_version; | |
| 59 | + Elf32_Addr e_entry; /* Entry point */ | |
| 60 | + Elf32_Off e_phoff; | |
| 61 | + Elf32_Off e_shoff; | |
| 62 | + Elf32_Word e_flags; | |
| 63 | + Elf32_Half e_ehsize; | |
| 64 | + Elf32_Half e_phentsize; | |
| 65 | + Elf32_Half e_phnum; | |
| 66 | + Elf32_Half e_shentsize; | |
| 67 | + Elf32_Half e_shnum; | |
| 68 | + Elf32_Half e_shstrndx; | |
| 69 | +} Elf32_Ehdr; | |
| 70 | + | |
| 71 | +typedef struct elf64_hdr { | |
| 72 | + unsigned char e_ident[16]; /* ELF "magic number" */ | |
| 73 | + Elf64_Half e_type; | |
| 74 | + Elf64_Half e_machine; | |
| 75 | + Elf64_Word e_version; | |
| 76 | + Elf64_Addr e_entry; /* Entry point virtual address */ | |
| 77 | + Elf64_Off e_phoff; /* Program header table file offset */ | |
| 78 | + Elf64_Off e_shoff; /* Section header table file offset */ | |
| 79 | + Elf64_Word e_flags; | |
| 80 | + Elf64_Half e_ehsize; | |
| 81 | + Elf64_Half e_phentsize; | |
| 82 | + Elf64_Half e_phnum; | |
| 83 | + Elf64_Half e_shentsize; | |
| 84 | + Elf64_Half e_shnum; | |
| 85 | + Elf64_Half e_shstrndx; | |
| 86 | +} Elf64_Ehdr; | |
| 87 | + | |
| 88 | +/* These constants define the permissions on sections in the program | |
| 89 | + header, p_flags. */ | |
| 90 | +#define PF_R 0x4 | |
| 91 | +#define PF_W 0x2 | |
| 92 | +#define PF_X 0x1 | |
| 93 | + | |
| 94 | +typedef struct elf32_phdr { | |
| 95 | + Elf32_Word p_type; | |
| 96 | + Elf32_Off p_offset; | |
| 97 | + Elf32_Addr p_vaddr; | |
| 98 | + Elf32_Addr p_paddr; | |
| 99 | + Elf32_Word p_filesz; | |
| 100 | + Elf32_Word p_memsz; | |
| 101 | + Elf32_Word p_flags; | |
| 102 | + Elf32_Word p_align; | |
| 103 | +} Elf32_Phdr; | |
| 104 | + | |
| 105 | +typedef struct elf64_phdr { | |
| 106 | + Elf64_Word p_type; | |
| 107 | + Elf64_Word p_flags; | |
| 108 | + Elf64_Off p_offset; /* Segment file offset */ | |
| 109 | + Elf64_Addr p_vaddr; /* Segment virtual address */ | |
| 110 | + Elf64_Addr p_paddr; /* Segment physical address */ | |
| 111 | + Elf64_Xword p_filesz; /* Segment size in file */ | |
| 112 | + Elf64_Xword p_memsz; /* Segment size in memory */ | |
| 113 | + Elf64_Xword p_align; /* Segment alignment, file & memory */ | |
| 114 | +} Elf64_Phdr; | |
| 115 | + | |
| 116 | +#define EI_MAG0 0 /* e_ident[] indexes */ | |
| 117 | +#define EI_MAG1 1 | |
| 118 | +#define EI_MAG2 2 | |
| 119 | +#define EI_MAG3 3 | |
| 120 | +#define EI_CLASS 4 | |
| 121 | +#define EI_DATA 5 | |
| 122 | +#define EI_VERSION 6 | |
| 123 | +#define EI_OSABI 7 | |
| 124 | +#define EI_PAD 8 | |
| 125 | + | |
| 126 | +#define ELFMAG0 0x7f /* EI_MAG */ | |
| 127 | +#define ELFMAG1 'E' | |
| 128 | +#define ELFMAG2 'L' | |
| 129 | +#define ELFMAG3 'F' | |
| 130 | +#define ELFMAG "\177ELF" | |
| 131 | +#define SELFMAG 4 | |
| 132 | + | |
| 133 | +#define ELFCLASSNONE 0 /* EI_CLASS */ | |
| 134 | +#define ELFCLASS32 1 | |
| 135 | +#define ELFCLASS64 2 | |
| 136 | +#define ELFCLASSNUM 3 | |
| 137 | + | |
| 138 | +#define ELFDATANONE 0 /* e_ident[EI_DATA] */ | |
| 139 | +#define ELFDATA2LSB 1 | |
| 140 | +#define ELFDATA2MSB 2 | |
| 141 | + | |
| 142 | +#define EV_NONE 0 /* e_version, EI_VERSION */ | |
| 143 | +#define EV_CURRENT 1 | |
| 144 | +#define EV_NUM 2 | |
| 145 | + | |
| 146 | +#define ELFOSABI_NONE 0 | |
| 147 | +#define ELFOSABI_LINUX 3 | |
| 148 | + | |
| 149 | +#endif /* _PPC_BOOT_ELF_H_ */ |
arch/ppc64/boot/main.c
| ... | ... | @@ -8,36 +8,28 @@ |
| 8 | 8 | * as published by the Free Software Foundation; either version |
| 9 | 9 | * 2 of the License, or (at your option) any later version. |
| 10 | 10 | */ |
| 11 | -#include "ppc32-types.h" | |
| 11 | +#include <stdarg.h> | |
| 12 | +#include <stddef.h> | |
| 13 | +#include "elf.h" | |
| 14 | +#include "page.h" | |
| 15 | +#include "string.h" | |
| 16 | +#include "stdio.h" | |
| 17 | +#include "prom.h" | |
| 12 | 18 | #include "zlib.h" |
| 13 | -#include <linux/elf.h> | |
| 14 | -#include <linux/string.h> | |
| 15 | -#include <asm/processor.h> | |
| 16 | -#include <asm/page.h> | |
| 17 | 19 | |
| 18 | -extern void *finddevice(const char *); | |
| 19 | -extern int getprop(void *, const char *, void *, int); | |
| 20 | -extern void printf(const char *fmt, ...); | |
| 21 | -extern int sprintf(char *buf, const char *fmt, ...); | |
| 22 | -void gunzip(void *, int, unsigned char *, int *); | |
| 23 | -void *claim(unsigned int, unsigned int, unsigned int); | |
| 24 | -void flush_cache(void *, unsigned long); | |
| 25 | -void pause(void); | |
| 26 | -extern void exit(void); | |
| 20 | +static void gunzip(void *, int, unsigned char *, int *); | |
| 21 | +extern void flush_cache(void *, unsigned long); | |
| 27 | 22 | |
| 28 | -unsigned long strlen(const char *s); | |
| 29 | -void *memmove(void *dest, const void *src, unsigned long n); | |
| 30 | -void *memcpy(void *dest, const void *src, unsigned long n); | |
| 31 | 23 | |
| 32 | 24 | /* Value picked to match that used by yaboot */ |
| 33 | 25 | #define PROG_START 0x01400000 |
| 34 | 26 | #define RAM_END (256<<20) // Fixme: use OF */ |
| 35 | 27 | |
| 36 | -char *avail_ram; | |
| 37 | -char *begin_avail, *end_avail; | |
| 38 | -char *avail_high; | |
| 39 | -unsigned int heap_use; | |
| 40 | -unsigned int heap_max; | |
| 28 | +static char *avail_ram; | |
| 29 | +static char *begin_avail, *end_avail; | |
| 30 | +static char *avail_high; | |
| 31 | +static unsigned int heap_use; | |
| 32 | +static unsigned int heap_max; | |
| 41 | 33 | |
| 42 | 34 | extern char _start[]; |
| 43 | 35 | extern char _vmlinux_start[]; |
| ... | ... | @@ -52,9 +44,9 @@ |
| 52 | 44 | unsigned long size; |
| 53 | 45 | unsigned long memsize; |
| 54 | 46 | }; |
| 55 | -struct addr_range vmlinux = {0, 0, 0}; | |
| 56 | -struct addr_range vmlinuz = {0, 0, 0}; | |
| 57 | -struct addr_range initrd = {0, 0, 0}; | |
| 47 | +static struct addr_range vmlinux = {0, 0, 0}; | |
| 48 | +static struct addr_range vmlinuz = {0, 0, 0}; | |
| 49 | +static struct addr_range initrd = {0, 0, 0}; | |
| 58 | 50 | |
| 59 | 51 | static char scratch[128<<10]; /* 128kB of scratch space for gunzip */ |
| 60 | 52 | |
| ... | ... | @@ -64,13 +56,6 @@ |
| 64 | 56 | void *); |
| 65 | 57 | |
| 66 | 58 | |
| 67 | -int (*prom)(void *); | |
| 68 | - | |
| 69 | -void *chosen_handle; | |
| 70 | -void *stdin; | |
| 71 | -void *stdout; | |
| 72 | -void *stderr; | |
| 73 | - | |
| 74 | 59 | #undef DEBUG |
| 75 | 60 | |
| 76 | 61 | static unsigned long claim_base = PROG_START; |
| ... | ... | @@ -277,7 +262,7 @@ |
| 277 | 262 | |
| 278 | 263 | #define DEFLATED 8 |
| 279 | 264 | |
| 280 | -void gunzip(void *dst, int dstlen, unsigned char *src, int *lenp) | |
| 265 | +static void gunzip(void *dst, int dstlen, unsigned char *src, int *lenp) | |
| 281 | 266 | { |
| 282 | 267 | z_stream s; |
| 283 | 268 | int r, i, flags; |
arch/ppc64/boot/page.h
| 1 | +#ifndef _PPC_BOOT_PAGE_H | |
| 2 | +#define _PPC_BOOT_PAGE_H | |
| 3 | +/* | |
| 4 | + * Copyright (C) 2001 PPC64 Team, IBM Corp | |
| 5 | + * | |
| 6 | + * This program is free software; you can redistribute it and/or | |
| 7 | + * modify it under the terms of the GNU General Public License | |
| 8 | + * as published by the Free Software Foundation; either version | |
| 9 | + * 2 of the License, or (at your option) any later version. | |
| 10 | + */ | |
| 11 | + | |
| 12 | +#ifdef __ASSEMBLY__ | |
| 13 | +#define ASM_CONST(x) x | |
| 14 | +#else | |
| 15 | +#define __ASM_CONST(x) x##UL | |
| 16 | +#define ASM_CONST(x) __ASM_CONST(x) | |
| 17 | +#endif | |
| 18 | + | |
| 19 | +/* PAGE_SHIFT determines the page size */ | |
| 20 | +#define PAGE_SHIFT 12 | |
| 21 | +#define PAGE_SIZE (ASM_CONST(1) << PAGE_SHIFT) | |
| 22 | +#define PAGE_MASK (~(PAGE_SIZE-1)) | |
| 23 | + | |
| 24 | +/* align addr on a size boundary - adjust address up/down if needed */ | |
| 25 | +#define _ALIGN_UP(addr,size) (((addr)+((size)-1))&(~((size)-1))) | |
| 26 | +#define _ALIGN_DOWN(addr,size) ((addr)&(~((size)-1))) | |
| 27 | + | |
| 28 | +/* align addr on a size boundary - adjust address up if needed */ | |
| 29 | +#define _ALIGN(addr,size) _ALIGN_UP(addr,size) | |
| 30 | + | |
| 31 | +/* to align the pointer to the (next) page boundary */ | |
| 32 | +#define PAGE_ALIGN(addr) _ALIGN(addr, PAGE_SIZE) | |
| 33 | + | |
| 34 | +#endif /* _PPC_BOOT_PAGE_H */ |
arch/ppc64/boot/ppc32-types.h
| 1 | -#ifndef _PPC64_TYPES_H | |
| 2 | -#define _PPC64_TYPES_H | |
| 3 | - | |
| 4 | -typedef __signed__ char __s8; | |
| 5 | -typedef unsigned char __u8; | |
| 6 | - | |
| 7 | -typedef __signed__ short __s16; | |
| 8 | -typedef unsigned short __u16; | |
| 9 | - | |
| 10 | -typedef __signed__ int __s32; | |
| 11 | -typedef unsigned int __u32; | |
| 12 | - | |
| 13 | -typedef __signed__ long long __s64; | |
| 14 | -typedef unsigned long long __u64; | |
| 15 | - | |
| 16 | -typedef signed char s8; | |
| 17 | -typedef unsigned char u8; | |
| 18 | - | |
| 19 | -typedef signed short s16; | |
| 20 | -typedef unsigned short u16; | |
| 21 | - | |
| 22 | -typedef signed int s32; | |
| 23 | -typedef unsigned int u32; | |
| 24 | - | |
| 25 | -typedef signed long long s64; | |
| 26 | -typedef unsigned long long u64; | |
| 27 | - | |
| 28 | -typedef struct { | |
| 29 | - __u32 u[4]; | |
| 30 | -} __attribute((aligned(16))) __vector128; | |
| 31 | - | |
| 32 | -#define BITS_PER_LONG 32 | |
| 33 | - | |
| 34 | -typedef __vector128 vector128; | |
| 35 | - | |
| 36 | -#endif /* _PPC64_TYPES_H */ |
arch/ppc64/boot/ppc_asm.h
| 1 | +#ifndef _PPC64_PPC_ASM_H | |
| 2 | +#define _PPC64_PPC_ASM_H | |
| 3 | +/* | |
| 4 | + * | |
| 5 | + * Definitions used by various bits of low-level assembly code on PowerPC. | |
| 6 | + * | |
| 7 | + * Copyright (C) 1995-1999 Gary Thomas, Paul Mackerras, Cort Dougan. | |
| 8 | + * | |
| 9 | + * This program is free software; you can redistribute it and/or | |
| 10 | + * modify it under the terms of the GNU General Public License | |
| 11 | + * as published by the Free Software Foundation; either version | |
| 12 | + * 2 of the License, or (at your option) any later version. | |
| 13 | + */ | |
| 14 | + | |
| 15 | +/* Condition Register Bit Fields */ | |
| 16 | + | |
| 17 | +#define cr0 0 | |
| 18 | +#define cr1 1 | |
| 19 | +#define cr2 2 | |
| 20 | +#define cr3 3 | |
| 21 | +#define cr4 4 | |
| 22 | +#define cr5 5 | |
| 23 | +#define cr6 6 | |
| 24 | +#define cr7 7 | |
| 25 | + | |
| 26 | + | |
| 27 | +/* General Purpose Registers (GPRs) */ | |
| 28 | + | |
| 29 | +#define r0 0 | |
| 30 | +#define r1 1 | |
| 31 | +#define r2 2 | |
| 32 | +#define r3 3 | |
| 33 | +#define r4 4 | |
| 34 | +#define r5 5 | |
| 35 | +#define r6 6 | |
| 36 | +#define r7 7 | |
| 37 | +#define r8 8 | |
| 38 | +#define r9 9 | |
| 39 | +#define r10 10 | |
| 40 | +#define r11 11 | |
| 41 | +#define r12 12 | |
| 42 | +#define r13 13 | |
| 43 | +#define r14 14 | |
| 44 | +#define r15 15 | |
| 45 | +#define r16 16 | |
| 46 | +#define r17 17 | |
| 47 | +#define r18 18 | |
| 48 | +#define r19 19 | |
| 49 | +#define r20 20 | |
| 50 | +#define r21 21 | |
| 51 | +#define r22 22 | |
| 52 | +#define r23 23 | |
| 53 | +#define r24 24 | |
| 54 | +#define r25 25 | |
| 55 | +#define r26 26 | |
| 56 | +#define r27 27 | |
| 57 | +#define r28 28 | |
| 58 | +#define r29 29 | |
| 59 | +#define r30 30 | |
| 60 | +#define r31 31 | |
| 61 | + | |
| 62 | +#endif /* _PPC64_PPC_ASM_H */ |
arch/ppc64/boot/prom.c
| ... | ... | @@ -7,44 +7,20 @@ |
| 7 | 7 | * 2 of the License, or (at your option) any later version. |
| 8 | 8 | */ |
| 9 | 9 | #include <stdarg.h> |
| 10 | -#include <linux/types.h> | |
| 11 | -#include <linux/string.h> | |
| 12 | -#include <linux/ctype.h> | |
| 10 | +#include <stddef.h> | |
| 11 | +#include "string.h" | |
| 12 | +#include "stdio.h" | |
| 13 | +#include "prom.h" | |
| 13 | 14 | |
| 14 | -extern __u32 __div64_32(unsigned long long *dividend, __u32 divisor); | |
| 15 | - | |
| 16 | -/* The unnecessary pointer compare is there | |
| 17 | - * to check for type safety (n must be 64bit) | |
| 18 | - */ | |
| 19 | -# define do_div(n,base) ({ \ | |
| 20 | - __u32 __base = (base); \ | |
| 21 | - __u32 __rem; \ | |
| 22 | - (void)(((typeof((n)) *)0) == ((unsigned long long *)0)); \ | |
| 23 | - if (((n) >> 32) == 0) { \ | |
| 24 | - __rem = (__u32)(n) % __base; \ | |
| 25 | - (n) = (__u32)(n) / __base; \ | |
| 26 | - } else \ | |
| 27 | - __rem = __div64_32(&(n), __base); \ | |
| 28 | - __rem; \ | |
| 29 | - }) | |
| 30 | - | |
| 31 | 15 | int (*prom)(void *); |
| 32 | 16 | |
| 33 | 17 | void *chosen_handle; |
| 18 | + | |
| 34 | 19 | void *stdin; |
| 35 | 20 | void *stdout; |
| 36 | 21 | void *stderr; |
| 37 | 22 | |
| 38 | -void exit(void); | |
| 39 | -void *finddevice(const char *name); | |
| 40 | -int getprop(void *phandle, const char *name, void *buf, int buflen); | |
| 41 | -void chrpboot(int a1, int a2, void *prom); /* in main.c */ | |
| 42 | 23 | |
| 43 | -int printf(char *fmt, ...); | |
| 44 | - | |
| 45 | -/* there is no convenient header to get this from... -- paulus */ | |
| 46 | -extern unsigned long strlen(const char *); | |
| 47 | - | |
| 48 | 24 | int |
| 49 | 25 | write(void *handle, void *ptr, int nb) |
| 50 | 26 | { |
| ... | ... | @@ -210,107 +186,6 @@ |
| 210 | 186 | return write(f, str, n) == n? 0: -1; |
| 211 | 187 | } |
| 212 | 188 | |
| 213 | -int | |
| 214 | -readchar(void) | |
| 215 | -{ | |
| 216 | - char ch; | |
| 217 | - | |
| 218 | - for (;;) { | |
| 219 | - switch (read(stdin, &ch, 1)) { | |
| 220 | - case 1: | |
| 221 | - return ch; | |
| 222 | - case -1: | |
| 223 | - printf("read(stdin) returned -1\r\n"); | |
| 224 | - return -1; | |
| 225 | - } | |
| 226 | - } | |
| 227 | -} | |
| 228 | - | |
| 229 | -static char line[256]; | |
| 230 | -static char *lineptr; | |
| 231 | -static int lineleft; | |
| 232 | - | |
| 233 | -int | |
| 234 | -getchar(void) | |
| 235 | -{ | |
| 236 | - int c; | |
| 237 | - | |
| 238 | - if (lineleft == 0) { | |
| 239 | - lineptr = line; | |
| 240 | - for (;;) { | |
| 241 | - c = readchar(); | |
| 242 | - if (c == -1 || c == 4) | |
| 243 | - break; | |
| 244 | - if (c == '\r' || c == '\n') { | |
| 245 | - *lineptr++ = '\n'; | |
| 246 | - putchar('\n'); | |
| 247 | - break; | |
| 248 | - } | |
| 249 | - switch (c) { | |
| 250 | - case 0177: | |
| 251 | - case '\b': | |
| 252 | - if (lineptr > line) { | |
| 253 | - putchar('\b'); | |
| 254 | - putchar(' '); | |
| 255 | - putchar('\b'); | |
| 256 | - --lineptr; | |
| 257 | - } | |
| 258 | - break; | |
| 259 | - case 'U' & 0x1F: | |
| 260 | - while (lineptr > line) { | |
| 261 | - putchar('\b'); | |
| 262 | - putchar(' '); | |
| 263 | - putchar('\b'); | |
| 264 | - --lineptr; | |
| 265 | - } | |
| 266 | - break; | |
| 267 | - default: | |
| 268 | - if (lineptr >= &line[sizeof(line) - 1]) | |
| 269 | - putchar('\a'); | |
| 270 | - else { | |
| 271 | - putchar(c); | |
| 272 | - *lineptr++ = c; | |
| 273 | - } | |
| 274 | - } | |
| 275 | - } | |
| 276 | - lineleft = lineptr - line; | |
| 277 | - lineptr = line; | |
| 278 | - } | |
| 279 | - if (lineleft == 0) | |
| 280 | - return -1; | |
| 281 | - --lineleft; | |
| 282 | - return *lineptr++; | |
| 283 | -} | |
| 284 | - | |
| 285 | - | |
| 286 | - | |
| 287 | -/* String functions lifted from lib/vsprintf.c and lib/ctype.c */ | |
| 288 | -unsigned char _ctype[] = { | |
| 289 | -_C,_C,_C,_C,_C,_C,_C,_C, /* 0-7 */ | |
| 290 | -_C,_C|_S,_C|_S,_C|_S,_C|_S,_C|_S,_C,_C, /* 8-15 */ | |
| 291 | -_C,_C,_C,_C,_C,_C,_C,_C, /* 16-23 */ | |
| 292 | -_C,_C,_C,_C,_C,_C,_C,_C, /* 24-31 */ | |
| 293 | -_S|_SP,_P,_P,_P,_P,_P,_P,_P, /* 32-39 */ | |
| 294 | -_P,_P,_P,_P,_P,_P,_P,_P, /* 40-47 */ | |
| 295 | -_D,_D,_D,_D,_D,_D,_D,_D, /* 48-55 */ | |
| 296 | -_D,_D,_P,_P,_P,_P,_P,_P, /* 56-63 */ | |
| 297 | -_P,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U, /* 64-71 */ | |
| 298 | -_U,_U,_U,_U,_U,_U,_U,_U, /* 72-79 */ | |
| 299 | -_U,_U,_U,_U,_U,_U,_U,_U, /* 80-87 */ | |
| 300 | -_U,_U,_U,_P,_P,_P,_P,_P, /* 88-95 */ | |
| 301 | -_P,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L, /* 96-103 */ | |
| 302 | -_L,_L,_L,_L,_L,_L,_L,_L, /* 104-111 */ | |
| 303 | -_L,_L,_L,_L,_L,_L,_L,_L, /* 112-119 */ | |
| 304 | -_L,_L,_L,_P,_P,_P,_P,_C, /* 120-127 */ | |
| 305 | -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 128-143 */ | |
| 306 | -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 144-159 */ | |
| 307 | -_S|_SP,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P, /* 160-175 */ | |
| 308 | -_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P, /* 176-191 */ | |
| 309 | -_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U, /* 192-207 */ | |
| 310 | -_U,_U,_U,_U,_U,_U,_U,_P,_U,_U,_U,_U,_U,_U,_U,_L, /* 208-223 */ | |
| 311 | -_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L, /* 224-239 */ | |
| 312 | -_L,_L,_L,_L,_L,_L,_L,_P,_L,_L,_L,_L,_L,_L,_L,_L}; /* 240-255 */ | |
| 313 | - | |
| 314 | 189 | size_t strnlen(const char * s, size_t count) |
| 315 | 190 | { |
| 316 | 191 | const char *sc; |
| 317 | 192 | |
| 318 | 193 | |
| 319 | 194 | |
| 320 | 195 | |
| ... | ... | @@ -320,44 +195,30 @@ |
| 320 | 195 | return sc - s; |
| 321 | 196 | } |
| 322 | 197 | |
| 323 | -unsigned long simple_strtoul(const char *cp,char **endp,unsigned int base) | |
| 324 | -{ | |
| 325 | - unsigned long result = 0,value; | |
| 198 | +extern unsigned int __div64_32(unsigned long long *dividend, | |
| 199 | + unsigned int divisor); | |
| 326 | 200 | |
| 327 | - if (!base) { | |
| 328 | - base = 10; | |
| 329 | - if (*cp == '0') { | |
| 330 | - base = 8; | |
| 331 | - cp++; | |
| 332 | - if ((*cp == 'x') && isxdigit(cp[1])) { | |
| 333 | - cp++; | |
| 334 | - base = 16; | |
| 335 | - } | |
| 336 | - } | |
| 337 | - } | |
| 338 | - while (isxdigit(*cp) && | |
| 339 | - (value = isdigit(*cp) ? *cp-'0' : toupper(*cp)-'A'+10) < base) { | |
| 340 | - result = result*base + value; | |
| 341 | - cp++; | |
| 342 | - } | |
| 343 | - if (endp) | |
| 344 | - *endp = (char *)cp; | |
| 345 | - return result; | |
| 346 | -} | |
| 201 | +/* The unnecessary pointer compare is there | |
| 202 | + * to check for type safety (n must be 64bit) | |
| 203 | + */ | |
| 204 | +# define do_div(n,base) ({ \ | |
| 205 | + unsigned int __base = (base); \ | |
| 206 | + unsigned int __rem; \ | |
| 207 | + (void)(((typeof((n)) *)0) == ((unsigned long long *)0)); \ | |
| 208 | + if (((n) >> 32) == 0) { \ | |
| 209 | + __rem = (unsigned int)(n) % __base; \ | |
| 210 | + (n) = (unsigned int)(n) / __base; \ | |
| 211 | + } else \ | |
| 212 | + __rem = __div64_32(&(n), __base); \ | |
| 213 | + __rem; \ | |
| 214 | + }) | |
| 347 | 215 | |
| 348 | -long simple_strtol(const char *cp,char **endp,unsigned int base) | |
| 349 | -{ | |
| 350 | - if(*cp=='-') | |
| 351 | - return -simple_strtoul(cp+1,endp,base); | |
| 352 | - return simple_strtoul(cp,endp,base); | |
| 353 | -} | |
| 354 | - | |
| 355 | 216 | static int skip_atoi(const char **s) |
| 356 | 217 | { |
| 357 | - int i=0; | |
| 218 | + int i, c; | |
| 358 | 219 | |
| 359 | - while (isdigit(**s)) | |
| 360 | - i = i*10 + *((*s)++) - '0'; | |
| 220 | + for (i = 0; '0' <= (c = **s) && c <= '9'; ++*s) | |
| 221 | + i = i*10 + c - '0'; | |
| 361 | 222 | return i; |
| 362 | 223 | } |
| 363 | 224 | |
| ... | ... | @@ -436,9 +297,6 @@ |
| 436 | 297 | return str; |
| 437 | 298 | } |
| 438 | 299 | |
| 439 | -/* Forward decl. needed for IP address printing stuff... */ | |
| 440 | -int sprintf(char * buf, const char *fmt, ...); | |
| 441 | - | |
| 442 | 300 | int vsprintf(char *buf, const char *fmt, va_list args) |
| 443 | 301 | { |
| 444 | 302 | int len; |
| ... | ... | @@ -477,7 +335,7 @@ |
| 477 | 335 | |
| 478 | 336 | /* get field width */ |
| 479 | 337 | field_width = -1; |
| 480 | - if (isdigit(*fmt)) | |
| 338 | + if ('0' <= *fmt && *fmt <= '9') | |
| 481 | 339 | field_width = skip_atoi(&fmt); |
| 482 | 340 | else if (*fmt == '*') { |
| 483 | 341 | ++fmt; |
| ... | ... | @@ -493,7 +351,7 @@ |
| 493 | 351 | precision = -1; |
| 494 | 352 | if (*fmt == '.') { |
| 495 | 353 | ++fmt; |
| 496 | - if (isdigit(*fmt)) | |
| 354 | + if ('0' <= *fmt && *fmt <= '9') | |
| 497 | 355 | precision = skip_atoi(&fmt); |
| 498 | 356 | else if (*fmt == '*') { |
| 499 | 357 | ++fmt; |
| ... | ... | @@ -628,7 +486,7 @@ |
| 628 | 486 | static char sprint_buf[1024]; |
| 629 | 487 | |
| 630 | 488 | int |
| 631 | -printf(char *fmt, ...) | |
| 489 | +printf(const char *fmt, ...) | |
| 632 | 490 | { |
| 633 | 491 | va_list args; |
| 634 | 492 | int n; |
arch/ppc64/boot/prom.h
| 1 | +#ifndef _PPC_BOOT_PROM_H_ | |
| 2 | +#define _PPC_BOOT_PROM_H_ | |
| 3 | + | |
| 4 | +extern int (*prom) (void *); | |
| 5 | +extern void *chosen_handle; | |
| 6 | + | |
| 7 | +extern void *stdin; | |
| 8 | +extern void *stdout; | |
| 9 | +extern void *stderr; | |
| 10 | + | |
| 11 | +extern int write(void *handle, void *ptr, int nb); | |
| 12 | +extern int read(void *handle, void *ptr, int nb); | |
| 13 | +extern void exit(void); | |
| 14 | +extern void pause(void); | |
| 15 | +extern void *finddevice(const char *); | |
| 16 | +extern void *claim(unsigned long virt, unsigned long size, unsigned long align); | |
| 17 | +extern int getprop(void *phandle, const char *name, void *buf, int buflen); | |
| 18 | +#endif /* _PPC_BOOT_PROM_H_ */ |
arch/ppc64/boot/stdio.h
| 1 | +#ifndef _PPC_BOOT_STDIO_H_ | |
| 2 | +#define _PPC_BOOT_STDIO_H_ | |
| 3 | + | |
| 4 | +extern int printf(const char *fmt, ...); | |
| 5 | + | |
| 6 | +extern int sprintf(char *buf, const char *fmt, ...); | |
| 7 | + | |
| 8 | +extern int vsprintf(char *buf, const char *fmt, va_list args); | |
| 9 | + | |
| 10 | +extern int putc(int c, void *f); | |
| 11 | +extern int putchar(int c); | |
| 12 | +extern int getchar(void); | |
| 13 | + | |
| 14 | +extern int fputs(char *str, void *f); | |
| 15 | + | |
| 16 | +#endif /* _PPC_BOOT_STDIO_H_ */ |
arch/ppc64/boot/string.S
arch/ppc64/boot/string.h
| 1 | +#ifndef _PPC_BOOT_STRING_H_ | |
| 2 | +#define _PPC_BOOT_STRING_H_ | |
| 3 | + | |
| 4 | +extern char *strcpy(char *dest, const char *src); | |
| 5 | +extern char *strncpy(char *dest, const char *src, size_t n); | |
| 6 | +extern char *strcat(char *dest, const char *src); | |
| 7 | +extern int strcmp(const char *s1, const char *s2); | |
| 8 | +extern size_t strlen(const char *s); | |
| 9 | +extern size_t strnlen(const char *s, size_t count); | |
| 10 | + | |
| 11 | +extern void *memset(void *s, int c, size_t n); | |
| 12 | +extern void *memmove(void *dest, const void *src, unsigned long n); | |
| 13 | +extern void *memcpy(void *dest, const void *src, unsigned long n); | |
| 14 | +extern int memcmp(const void *s1, const void *s2, size_t n); | |
| 15 | + | |
| 16 | +#endif /* _PPC_BOOT_STRING_H_ */ |