Merge 4e3cf62f5b
into 35e0dbed34
commit
5d008f2f20
@ -0,0 +1,64 @@
|
|||||||
|
ARCH = $(shell uname -m)
|
||||||
|
ifneq ("$(ARCH)", "ppc64")
|
||||||
|
ifneq ("$(ARCH)", "ppc64le")
|
||||||
|
CROSS_COMPILE ?= powerpc64le-linux-gnu-
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
PYTHON3 ?= python3
|
||||||
|
MW_DEBUG ?= mw_debug
|
||||||
|
BRAM_ADDRESS ?= 0x80000000
|
||||||
|
|
||||||
|
# Use make V=1 for a verbose build.
|
||||||
|
ifndef V
|
||||||
|
Q_CC= @echo ' [CC] ' $@;
|
||||||
|
Q_LINK= @echo ' [LINK] ' $@;
|
||||||
|
Q_OBJCOPY=@echo ' [OBJCOPY] ' $@;
|
||||||
|
Q_PYTHON= @echo ' [PYTHON] ' $@;
|
||||||
|
endif
|
||||||
|
|
||||||
|
CC = $(CROSS_COMPILE)gcc
|
||||||
|
LD = $(CROSS_COMPILE)ld
|
||||||
|
OBJCOPY = $(CROSS_COMPILE)objcopy
|
||||||
|
|
||||||
|
CFLAGS = -Os -g -Wall -std=c99 -msoft-float -mno-string -mno-multiple \
|
||||||
|
-mno-vsx -mno-altivec -mlittle-endian -fno-stack-protector \
|
||||||
|
-mstrict-align -ffreestanding -nostdinc -flto \
|
||||||
|
-Ilibc/include/ -I../include -isystem $(shell $(CC) -print-file-name=include) \
|
||||||
|
-D__USE_LIBC
|
||||||
|
ASFLAGS = $(CFLAGS)
|
||||||
|
LDFLAGS = -T powerpc.lds -static -nostdlib -Wl,--gc-sections -Wl,--build-id=none
|
||||||
|
|
||||||
|
LIBC_SRC := libc/src/isdigit.c libc/src/memcmp.c libc/src/strcat.c \
|
||||||
|
libc/src/strncasecmp.c libc/src/strtok.c libc/src/vsnprintf.c \
|
||||||
|
libc/src/isprint.c libc/src/memcpy.c libc/src/strchr.c libc/src/strncmp.c \
|
||||||
|
libc/src/strtol.c libc/src/isspace.c libc/src/memmove.c libc/src/strcmp.c \
|
||||||
|
libc/src/strncpy.c libc/src/strtoul.c libc/src/isxdigit.c libc/src/memset.c \
|
||||||
|
libc/src/strcpy.c libc/src/strrchr.c libc/src/tolower.c libc/src/memchr.c \
|
||||||
|
libc/src/strcasecmp.c libc/src/strlen.c libc/src/strstr.c libc/src/toupper.c
|
||||||
|
LIBC_OBJ := $(LIBC_SRC:.c=.o)
|
||||||
|
|
||||||
|
COMPILE.c = $(Q_CC)$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
|
||||||
|
COMPILE.S = $(Q_CC)$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
|
||||||
|
|
||||||
|
all: loader.hex
|
||||||
|
|
||||||
|
load: loader.bin
|
||||||
|
$(MW_DEBUG) -b jtag load $^ $(BRAM_ADDRESS)
|
||||||
|
|
||||||
|
%.lds : %.lds.S
|
||||||
|
$(Q_CC)$(CC) -I../include -P -E $< -o $@
|
||||||
|
|
||||||
|
loader.elf: loader.o head.o ../lib/console.o $(LIBC_OBJ) | powerpc.lds
|
||||||
|
$(Q_LINK)$(CC) $(LDFLAGS) -o $@ $^
|
||||||
|
@size $@
|
||||||
|
|
||||||
|
loader.bin: loader.elf
|
||||||
|
$(Q_OBJCOPY)$(OBJCOPY) -O binary $^ $@
|
||||||
|
|
||||||
|
loader.hex: loader.bin
|
||||||
|
$(Q_PYTHON)$(PYTHON3) ../scripts/bin2hex.py $^ > $@
|
||||||
|
|
||||||
|
.PHONY:
|
||||||
|
clean:
|
||||||
|
@rm -f *.o $(LIBC_OBJ) ../lib/console.o loader.elf loader.bin loader.hex powerpc.lds
|
@ -0,0 +1,38 @@
|
|||||||
|
/* Copyright 2020 IBM Corp.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
* implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <microwatt_soc.h>
|
||||||
|
|
||||||
|
#define STACK_TOP (BRAM_BASE + 0x3000)
|
||||||
|
|
||||||
|
/* Load an immediate 64-bit value into a register */
|
||||||
|
#define LOAD_IMM64(r, e) \
|
||||||
|
lis r,(e)@highest; \
|
||||||
|
ori r,r,(e)@higher; \
|
||||||
|
rldicr r,r, 32, 31; \
|
||||||
|
oris r,r, (e)@h; \
|
||||||
|
ori r,r, (e)@l;
|
||||||
|
|
||||||
|
.section ".head","ax"
|
||||||
|
|
||||||
|
.global start
|
||||||
|
start:
|
||||||
|
/* setup stack */
|
||||||
|
LOAD_IMM64(%r1, STACK_TOP - 0x100)
|
||||||
|
LOAD_IMM64(%r12, main)
|
||||||
|
mtctr %r12,
|
||||||
|
bctrl
|
||||||
|
b .
|
@ -0,0 +1,29 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright (c) 2004, 2008, 2012 IBM Corporation
|
||||||
|
* All rights reserved.
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the BSD License
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial implementation
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _ASSERT_H
|
||||||
|
#define _ASSERT_H
|
||||||
|
|
||||||
|
#define assert(cond) \
|
||||||
|
do { if (!(cond)) { \
|
||||||
|
assert_fail(__FILE__ \
|
||||||
|
":" stringify(__LINE__) \
|
||||||
|
":" stringify(cond)); } \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
void __attribute__((noreturn)) assert_fail(const char *msg);
|
||||||
|
|
||||||
|
#define stringify(expr) stringify_1(expr)
|
||||||
|
/* Double-indirection required to stringify expansions */
|
||||||
|
#define stringify_1(expr) #expr
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,54 @@
|
|||||||
|
/* Copyright 2013-2014 IBM Corp.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
* implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __COMPILER_H
|
||||||
|
#define __COMPILER_H
|
||||||
|
|
||||||
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
/* Macros for various compiler bits and pieces */
|
||||||
|
#define __packed __attribute__((packed))
|
||||||
|
#define __align(x) __attribute__((__aligned__(x)))
|
||||||
|
#define __unused __attribute__((unused))
|
||||||
|
#define __used __attribute__((used))
|
||||||
|
#define __section(x) __attribute__((__section__(x)))
|
||||||
|
#define __noreturn __attribute__((noreturn))
|
||||||
|
/* not __const as this has a different meaning (const) */
|
||||||
|
#define __attrconst __attribute__((const))
|
||||||
|
#define __warn_unused_result __attribute__((warn_unused_result))
|
||||||
|
#define __noinline __attribute__((noinline))
|
||||||
|
|
||||||
|
#if 0 /* Provided by gcc stddef.h */
|
||||||
|
#define offsetof(type,m) __builtin_offsetof(type,m)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define __nomcount __attribute__((no_instrument_function))
|
||||||
|
|
||||||
|
/* Compiler barrier */
|
||||||
|
static inline void barrier(void)
|
||||||
|
{
|
||||||
|
// asm volatile("" : : : "memory");
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* __ASSEMBLY__ */
|
||||||
|
|
||||||
|
/* Stringification macro */
|
||||||
|
#define __tostr(x) #x
|
||||||
|
#define tostr(x) __tostr(x)
|
||||||
|
|
||||||
|
#endif /* __COMPILER_H */
|
@ -0,0 +1,26 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright (c) 2004, 2008 IBM Corporation
|
||||||
|
* All rights reserved.
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the BSD License
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial implementation
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _CTYPE_H
|
||||||
|
#define _CTYPE_H
|
||||||
|
|
||||||
|
#include <compiler.h>
|
||||||
|
|
||||||
|
int __attrconst isdigit(int c);
|
||||||
|
int __attrconst isxdigit(int c);
|
||||||
|
int __attrconst isprint(int c);
|
||||||
|
int __attrconst isspace(int c);
|
||||||
|
|
||||||
|
int __attrconst tolower(int c);
|
||||||
|
int __attrconst toupper(int c);
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,36 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright (c) 2004, 2008 IBM Corporation
|
||||||
|
* All rights reserved.
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the BSD License
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial implementation
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _ERRNO_H
|
||||||
|
#define _ERRNO_H
|
||||||
|
|
||||||
|
extern int errno;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Error number definitions
|
||||||
|
*/
|
||||||
|
#define EPERM 1 /* not permitted */
|
||||||
|
#define ENOENT 2 /* file or directory not found */
|
||||||
|
#define EIO 5 /* input/output error */
|
||||||
|
#define EBADF 9 /* Bad file number */
|
||||||
|
#define ENOMEM 12 /* not enough space */
|
||||||
|
#define EACCES 13 /* permission denied */
|
||||||
|
#define EFAULT 14 /* bad address */
|
||||||
|
#define EBUSY 16 /* resource busy */
|
||||||
|
#define EEXIST 17 /* file already exists */
|
||||||
|
#define ENODEV 19 /* device not found */
|
||||||
|
#define EINVAL 22 /* invalid argument */
|
||||||
|
#define EDOM 33 /* math argument out of domain of func */
|
||||||
|
#define ERANGE 34 /* math result not representable */
|
||||||
|
#define ENOSYS 38 /* Function not implemented */
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,32 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright (c) 2004, 2008 IBM Corporation
|
||||||
|
* All rights reserved.
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the BSD License
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial implementation
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _LIMITS_H
|
||||||
|
#define _LIMITS_H
|
||||||
|
|
||||||
|
#define UCHAR_MAX 255
|
||||||
|
#define SCHAR_MAX 127
|
||||||
|
#define SCHAR_MIN (-128)
|
||||||
|
|
||||||
|
#define USHRT_MAX 65535
|
||||||
|
#define SHRT_MAX 32767
|
||||||
|
#define SHRT_MIN (-32768)
|
||||||
|
|
||||||
|
#define UINT_MAX (4294967295U)
|
||||||
|
#define INT_MAX 2147483647
|
||||||
|
#define INT_MIN (-2147483648)
|
||||||
|
|
||||||
|
#define ULONG_MAX ((unsigned long)-1L)
|
||||||
|
#define LONG_MAX (ULONG_MAX/2)
|
||||||
|
#define LONG_MIN ((-LONG_MAX)-1)
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,30 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright (c) 2004, 2008 IBM Corporation
|
||||||
|
* All rights reserved.
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the BSD License
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial implementation
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _STDINT_H
|
||||||
|
#define _STDINT_H
|
||||||
|
|
||||||
|
typedef unsigned char uint8_t;
|
||||||
|
typedef signed char int8_t;
|
||||||
|
|
||||||
|
typedef unsigned short uint16_t;
|
||||||
|
typedef signed short int16_t;
|
||||||
|
|
||||||
|
typedef unsigned int uint32_t;
|
||||||
|
typedef signed int int32_t;
|
||||||
|
|
||||||
|
typedef unsigned long long uint64_t;
|
||||||
|
typedef signed long long int64_t;
|
||||||
|
|
||||||
|
typedef unsigned long int uintptr_t;
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,35 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright (c) 2004, 2008 IBM Corporation
|
||||||
|
* All rights reserved.
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the BSD License
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial implementation
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _STDIO_H
|
||||||
|
#define _STDIO_H
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include "stddef.h"
|
||||||
|
|
||||||
|
#define EOF (-1)
|
||||||
|
|
||||||
|
int _printf(const char *format, ...) __attribute__((format (printf, 1, 2)));
|
||||||
|
|
||||||
|
#ifndef pr_fmt
|
||||||
|
#define pr_fmt(fmt) fmt
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define printf(f, ...) do { _printf(pr_fmt(f), ##__VA_ARGS__); } while(0)
|
||||||
|
|
||||||
|
int snprintf(char *str, size_t size, const char *format, ...) __attribute__((format (printf, 3, 4)));
|
||||||
|
int vsnprintf(char *str, size_t size, const char *format, va_list);
|
||||||
|
|
||||||
|
int putchar(int ch);
|
||||||
|
int puts(const char *str);
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,25 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright (c) 2004, 2008 IBM Corporation
|
||||||
|
* All rights reserved.
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the BSD License
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial implementation
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _STDLIB_H
|
||||||
|
#define _STDLIB_H
|
||||||
|
|
||||||
|
#include "stddef.h"
|
||||||
|
|
||||||
|
#define RAND_MAX 32767
|
||||||
|
|
||||||
|
int atoi(const char *str);
|
||||||
|
long atol(const char *str);
|
||||||
|
unsigned long int strtoul(const char *nptr, char **endptr, int base);
|
||||||
|
long int strtol(const char *nptr, char **endptr, int base);
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,45 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright (c) 2004, 2016 IBM Corporation
|
||||||
|
* All rights reserved.
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the BSD License
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial implementation
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _STRING_H
|
||||||
|
#define _STRING_H
|
||||||
|
|
||||||
|
#include "stddef.h"
|
||||||
|
|
||||||
|
char *strcpy(char *dest, const char *src);
|
||||||
|
char *strncpy(char *dest, const char *src, size_t n);
|
||||||
|
char *strcat(char *dest, const char *src);
|
||||||
|
int strcmp(const char *s1, const char *s2);
|
||||||
|
int strncmp(const char *s1, const char *s2, size_t n);
|
||||||
|
int strcasecmp(const char *s1, const char *s2);
|
||||||
|
int strncasecmp(const char *s1, const char *s2, size_t n);
|
||||||
|
char *strchr(const char *s, int c);
|
||||||
|
char *strrchr(const char *s, int c);
|
||||||
|
size_t strlen(const char *s);
|
||||||
|
size_t strnlen(const char *s, size_t n);
|
||||||
|
char *strstr(const char *hay, const char *needle);
|
||||||
|
char *strtok(char *src, const char *pattern);
|
||||||
|
char *strdup(const char *src);
|
||||||
|
|
||||||
|
void *memset(void *s, int c, size_t n);
|
||||||
|
void *memchr(const void *s, int c, size_t n);
|
||||||
|
void *memcpy(void *dest, const void *src, size_t n);
|
||||||
|
void *memcpy_from_ci(void *destpp, const void *srcpp, size_t len);
|
||||||
|
void *memmove(void *dest, const void *src, size_t n);
|
||||||
|
int memcmp(const void *s1, const void *s2, size_t n);
|
||||||
|
|
||||||
|
static inline int ffs(unsigned long val)
|
||||||
|
{
|
||||||
|
return __builtin_ffs(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,26 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright (c) 2004, 2008 IBM Corporation
|
||||||
|
* All rights reserved.
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the BSD License
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial implementation
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _UNISTD_H
|
||||||
|
#define _UNISTD_H
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
typedef long ssize_t;
|
||||||
|
|
||||||
|
extern int open(const char *name, int flags);
|
||||||
|
extern int close(int fd);
|
||||||
|
extern ssize_t read(int fd, void *buf, size_t count);
|
||||||
|
extern ssize_t write(int fd, const void *buf, size_t count);
|
||||||
|
extern ssize_t lseek(int fd, long offset, int whence);
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,26 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright (c) 2004, 2008 IBM Corporation
|
||||||
|
* All rights reserved.
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the BSD License
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial implementation
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include <compiler.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
int __attrconst isdigit(int ch)
|
||||||
|
{
|
||||||
|
switch (ch) {
|
||||||
|
case '0': case '1': case '2': case '3': case '4':
|
||||||
|
case '5': case '6': case '7': case '8': case '9':
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright (c) 2004, 2008 IBM Corporation
|
||||||
|
* All rights reserved.
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the BSD License
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial implementation
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include <compiler.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
int __attrconst isprint(int ch)
|
||||||
|
{
|
||||||
|
return (ch >= 32 && ch < 127);
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright (c) 2004, 2008 IBM Corporation
|
||||||
|
* All rights reserved.
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the BSD License
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial implementation
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include <compiler.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
int __attrconst isspace(int ch)
|
||||||
|
{
|
||||||
|
switch (ch) {
|
||||||
|
case ' ':
|
||||||
|
case '\f':
|
||||||
|
case '\n':
|
||||||
|
case '\r':
|
||||||
|
case '\t':
|
||||||
|
case '\v':
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright (c) 2004, 2008 IBM Corporation
|
||||||
|
* All rights reserved.
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the BSD License
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial implementation
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include <compiler.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
int __attrconst isxdigit(int ch)
|
||||||
|
{
|
||||||
|
return (
|
||||||
|
(ch >= '0' && ch <= '9') |
|
||||||
|
(ch >= 'A' && ch <= 'F') |
|
||||||
|
(ch >= 'a' && ch <= 'f') );
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright (c) 2004, 2008 IBM Corporation
|
||||||
|
* All rights reserved.
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the BSD License
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial implementation
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
void *memchr(const void *ptr, int c, size_t n);
|
||||||
|
void *memchr(const void *ptr, int c, size_t n)
|
||||||
|
{
|
||||||
|
unsigned char ch = (unsigned char)c;
|
||||||
|
const unsigned char *p = ptr;
|
||||||
|
|
||||||
|
while (n-- > 0) {
|
||||||
|
if (*p == ch)
|
||||||
|
return (void *)p;
|
||||||
|
p += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright (c) 2004, 2008 IBM Corporation
|
||||||
|
* All rights reserved.
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the BSD License
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial implementation
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
int memcmp(const void *ptr1, const void *ptr2, size_t n);
|
||||||
|
int memcmp(const void *ptr1, const void *ptr2, size_t n)
|
||||||
|
{
|
||||||
|
const unsigned char *p1 = ptr1;
|
||||||
|
const unsigned char *p2 = ptr2;
|
||||||
|
|
||||||
|
while (n-- > 0) {
|
||||||
|
if (*p1 != *p2)
|
||||||
|
return (*p1 - *p2);
|
||||||
|
p1 += 1;
|
||||||
|
p2 += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright (c) 2004, 2008 IBM Corporation
|
||||||
|
* All rights reserved.
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the BSD License
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial implementation
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
void *memcpy(void *dest, const void *src, size_t n);
|
||||||
|
void *memcpy(void *dest, const void *src, size_t n)
|
||||||
|
{
|
||||||
|
void *ret = dest;
|
||||||
|
|
||||||
|
while (n >= 8) {
|
||||||
|
*(uint64_t *)dest = *(uint64_t *)src;
|
||||||
|
dest += 8;
|
||||||
|
src += 8;
|
||||||
|
n -= 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (n > 0) {
|
||||||
|
*(uint8_t *)dest = *(uint8_t *)src;
|
||||||
|
dest += 1;
|
||||||
|
src += 1;
|
||||||
|
n -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright (c) 2004, 2008 IBM Corporation
|
||||||
|
* All rights reserved.
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the BSD License
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial implementation
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
void *memcpy(void *dest, const void *src, size_t n);
|
||||||
|
void *memmove(void *dest, const void *src, size_t n);
|
||||||
|
void *memmove(void *dest, const void *src, size_t n)
|
||||||
|
{
|
||||||
|
/* Do the buffers overlap in a bad way? */
|
||||||
|
if (src < dest && src + n >= dest) {
|
||||||
|
char *cdest;
|
||||||
|
const char *csrc;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* Copy from end to start */
|
||||||
|
cdest = dest + n - 1;
|
||||||
|
csrc = src + n - 1;
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
*cdest-- = *csrc--;
|
||||||
|
}
|
||||||
|
return dest;
|
||||||
|
} else {
|
||||||
|
/* Normal copy is possible */
|
||||||
|
return memcpy(dest, src, n);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright (c) 2004, 2008 IBM Corporation
|
||||||
|
* All rights reserved.
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the BSD License
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial implementation
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#define CACHE_LINE_SIZE 128
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
void *memset(void *dest, int c, size_t size);
|
||||||
|
void *memset(void *dest, int c, size_t size)
|
||||||
|
{
|
||||||
|
unsigned char *d = (unsigned char *)dest;
|
||||||
|
unsigned long big_c = 0;
|
||||||
|
|
||||||
|
if (c) {
|
||||||
|
big_c = c;
|
||||||
|
big_c |= (big_c << 8) | big_c;
|
||||||
|
big_c |= (big_c << 16) | big_c;
|
||||||
|
big_c |= (big_c << 32) | big_c;
|
||||||
|
}
|
||||||
|
while (size >= 8 && c == 0) {
|
||||||
|
*((unsigned long *)d) = big_c;
|
||||||
|
d+=8;
|
||||||
|
size-=8;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (size-- > 0) {
|
||||||
|
*d++ = (unsigned char)c;
|
||||||
|
}
|
||||||
|
|
||||||
|
return dest;
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright (c) 2004, 2008 IBM Corporation
|
||||||
|
* All rights reserved.
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the BSD License
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial implementation
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
int strcasecmp(const char *s1, const char *s2);
|
||||||
|
int strcasecmp(const char *s1, const char *s2)
|
||||||
|
{
|
||||||
|
while (*s1 != 0 && *s2 != 0) {
|
||||||
|
if (toupper(*s1) != toupper(*s2))
|
||||||
|
break;
|
||||||
|
++s1;
|
||||||
|
++s2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return *s1 - *s2;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,26 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright (c) 2004, 2008 IBM Corporation
|
||||||
|
* All rights reserved.
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the BSD License
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial implementation
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
size_t strlen(const char *s);
|
||||||
|
char *strcpy(char *dst, const char *src);
|
||||||
|
char *strcat(char *dst, const char *src);
|
||||||
|
char *strcat(char *dst, const char *src)
|
||||||
|
{
|
||||||
|
size_t p;
|
||||||
|
|
||||||
|
p = strlen(dst);
|
||||||
|
strcpy(&dst[p], src);
|
||||||
|
|
||||||
|
return dst;
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright (c) 2004, 2008 IBM Corporation
|
||||||
|
* All rights reserved.
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the BSD License
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial implementation
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
char *strchr(const char *s, int c);
|
||||||
|
char *strchr(const char *s, int c)
|
||||||
|
{
|
||||||
|
char cb = c;
|
||||||
|
|
||||||
|
while (*s != 0) {
|
||||||
|
if (*s == cb) {
|
||||||
|
return (char *)s;
|
||||||
|
}
|
||||||
|
s += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright (c) 2004, 2008 IBM Corporation
|
||||||
|
* All rights reserved.
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the BSD License
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial implementation
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
int strcmp(const char *s1, const char *s2);
|
||||||
|
int strcmp(const char *s1, const char *s2)
|
||||||
|
{
|
||||||
|
while (*s1 != 0 && *s2 != 0) {
|
||||||
|
if (*s1 != *s2)
|
||||||
|
break;
|
||||||
|
s1 += 1;
|
||||||
|
s2 += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return *s1 - *s2;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,23 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright (c) 2004, 2008 IBM Corporation
|
||||||
|
* All rights reserved.
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the BSD License
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial implementation
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
char *strcpy(char *dst, const char *src);
|
||||||
|
char *strcpy(char *dst, const char *src)
|
||||||
|
{
|
||||||
|
char *ptr = dst;
|
||||||
|
|
||||||
|
do {
|
||||||
|
*ptr++ = *src;
|
||||||
|
} while (*src++ != 0);
|
||||||
|
|
||||||
|
return dst;
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright (c) 2004, 2008 IBM Corporation
|
||||||
|
* All rights reserved.
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the BSD License
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial implementation
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
size_t strlen(const char *s);
|
||||||
|
size_t strlen(const char *s)
|
||||||
|
{
|
||||||
|
size_t len = 0;
|
||||||
|
|
||||||
|
while (*s != 0) {
|
||||||
|
len += 1;
|
||||||
|
s += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t strnlen(const char *s, size_t n);
|
||||||
|
size_t strnlen(const char *s, size_t n)
|
||||||
|
{
|
||||||
|
size_t len = 0;
|
||||||
|
|
||||||
|
while (*s != 0 && n) {
|
||||||
|
len += 1;
|
||||||
|
s += 1;
|
||||||
|
n--;
|
||||||
|
}
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright (c) 2004, 2008 IBM Corporation
|
||||||
|
* All rights reserved.
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the BSD License
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial implementation
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
int strncasecmp(const char *s1, const char *s2, size_t n);
|
||||||
|
int strncasecmp(const char *s1, const char *s2, size_t n)
|
||||||
|
{
|
||||||
|
if (n < 1)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
while (*s1 != 0 && *s2 != 0 && --n > 0) {
|
||||||
|
if (toupper(*s1) != toupper(*s2))
|
||||||
|
break;
|
||||||
|
++s1;
|
||||||
|
++s2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return toupper(*s1) - toupper(*s2);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,30 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright (c) 2004, 2008 IBM Corporation
|
||||||
|
* All rights reserved.
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the BSD License
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial implementation
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
int strncmp(const char *s1, const char *s2, size_t n);
|
||||||
|
int strncmp(const char *s1, const char *s2, size_t n)
|
||||||
|
{
|
||||||
|
if (n < 1)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
while (*s1 != 0 && *s2 != 0 && --n > 0) {
|
||||||
|
if (*s1 != *s2)
|
||||||
|
break;
|
||||||
|
s1 += 1;
|
||||||
|
s2 += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return *s1 - *s2;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,33 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright (c) 2004, 2008 IBM Corporation
|
||||||
|
* All rights reserved.
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the BSD License
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial implementation
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
char *strncpy(char *dst, const char *src, size_t n);
|
||||||
|
char *strncpy(char *dst, const char *src, size_t n)
|
||||||
|
{
|
||||||
|
char *ret = dst;
|
||||||
|
|
||||||
|
/* Copy string */
|
||||||
|
while (*src != 0 && n > 0) {
|
||||||
|
*dst++ = *src++;
|
||||||
|
n -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* strncpy always clears the rest of destination string... */
|
||||||
|
while (n > 0) {
|
||||||
|
*dst++ = 0;
|
||||||
|
n -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright (c) 2004, 2008, 2019 IBM Corporation
|
||||||
|
* All rights reserved.
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the BSD License
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial implementation
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
char *strrchr(const char *s, int c);
|
||||||
|
char *strrchr(const char *s, int c)
|
||||||
|
{
|
||||||
|
char *last = NULL;
|
||||||
|
char cb = c;
|
||||||
|
|
||||||
|
while (*s != 0) {
|
||||||
|
if (*s == cb)
|
||||||
|
last = (char *)s;
|
||||||
|
s += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return last;
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright (c) 2004, 2008 IBM Corporation
|
||||||
|
* All rights reserved.
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the BSD License
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial implementation
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
size_t strlen(const char *s);
|
||||||
|
int strncmp(const char *s1, const char *s2, size_t n);
|
||||||
|
char *strstr(const char *hay, const char *needle);
|
||||||
|
char *strstr(const char *hay, const char *needle)
|
||||||
|
{
|
||||||
|
char *pos;
|
||||||
|
size_t hlen, nlen;
|
||||||
|
|
||||||
|
if (hay == NULL || needle == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
hlen = strlen(hay);
|
||||||
|
nlen = strlen(needle);
|
||||||
|
if (nlen < 1)
|
||||||
|
return (char *)hay;
|
||||||
|
|
||||||
|
for (pos = (char *)hay; pos < hay + hlen; pos++) {
|
||||||
|
if (strncmp(pos, needle, nlen) == 0) {
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,48 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright (c) 2004, 2008 IBM Corporation
|
||||||
|
* All rights reserved.
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the BSD License
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial implementation
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
char *strtok(char *src, const char *pattern);
|
||||||
|
char *strtok(char *src, const char *pattern)
|
||||||
|
{
|
||||||
|
static char *nxtTok;
|
||||||
|
char *retVal = NULL;
|
||||||
|
|
||||||
|
if (!src) {
|
||||||
|
src = nxtTok;
|
||||||
|
if (!src)
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (*src) {
|
||||||
|
const char *pp = pattern;
|
||||||
|
while (*pp) {
|
||||||
|
if (*pp == *src) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
pp++;
|
||||||
|
}
|
||||||
|
if (!*pp) {
|
||||||
|
if (!retVal)
|
||||||
|
retVal = src;
|
||||||
|
else if (!src[-1])
|
||||||
|
break;
|
||||||
|
} else
|
||||||
|
*src = '\0';
|
||||||
|
src++;
|
||||||
|
}
|
||||||
|
|
||||||
|
nxtTok = src;
|
||||||
|
|
||||||
|
return retVal;
|
||||||
|
}
|
@ -0,0 +1,113 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright (c) 2004, 2008 IBM Corporation
|
||||||
|
* All rights reserved.
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the BSD License
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial implementation
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
long int strtol(const char *S, char **PTR,int BASE)
|
||||||
|
{
|
||||||
|
long rval = 0;
|
||||||
|
short int negative = 0;
|
||||||
|
short int digit;
|
||||||
|
// *PTR is S, unless PTR is NULL, in which case i override it with my own ptr
|
||||||
|
char* ptr;
|
||||||
|
if (PTR == NULL)
|
||||||
|
{
|
||||||
|
//override
|
||||||
|
PTR = &ptr;
|
||||||
|
}
|
||||||
|
// i use PTR to advance through the string
|
||||||
|
*PTR = (char *) S;
|
||||||
|
//check if BASE is ok
|
||||||
|
if ((BASE < 0) || BASE > 36)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
// ignore white space at beginning of S
|
||||||
|
while ((**PTR == ' ')
|
||||||
|
|| (**PTR == '\t')
|
||||||
|
|| (**PTR == '\n')
|
||||||
|
|| (**PTR == '\r')
|
||||||
|
)
|
||||||
|
{
|
||||||
|
(*PTR)++;
|
||||||
|
}
|
||||||
|
// check if S starts with "-" in which case the return value is negative
|
||||||
|
if (**PTR == '-')
|
||||||
|
{
|
||||||
|
negative = 1;
|
||||||
|
(*PTR)++;
|
||||||
|
}
|
||||||
|
// if BASE is 0... determine the base from the first chars...
|
||||||
|
if (BASE == 0)
|
||||||
|
{
|
||||||
|
// if S starts with "0x", BASE = 16, else 10
|
||||||
|
if ((**PTR == '0') && (*((*PTR)+1) == 'x'))
|
||||||
|
{
|
||||||
|
BASE = 16;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
BASE = 10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (BASE == 16)
|
||||||
|
{
|
||||||
|
// S may start with "0x"
|
||||||
|
if ((**PTR == '0') && (*((*PTR)+1) == 'x'))
|
||||||
|
{
|
||||||
|
(*PTR)++;
|
||||||
|
(*PTR)++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//until end of string
|
||||||
|
while (**PTR)
|
||||||
|
{
|
||||||
|
if (((**PTR) >= '0') && ((**PTR) <= '9'))
|
||||||
|
{
|
||||||
|
//digit (0..9)
|
||||||
|
digit = **PTR - '0';
|
||||||
|
}
|
||||||
|
else if (((**PTR) >= 'a') && ((**PTR) <='z'))
|
||||||
|
{
|
||||||
|
//alphanumeric digit lowercase(a (10) .. z (35) )
|
||||||
|
digit = (**PTR - 'a') + 10;
|
||||||
|
}
|
||||||
|
else if (((**PTR) >= 'A') && ((**PTR) <='Z'))
|
||||||
|
{
|
||||||
|
//alphanumeric digit uppercase(a (10) .. z (35) )
|
||||||
|
digit = (**PTR - 'A') + 10;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//end of parseable number reached...
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (digit < BASE)
|
||||||
|
{
|
||||||
|
rval = (rval * BASE) + digit;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//digit found, but its too big for current base
|
||||||
|
//end of parseable number reached...
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
//next...
|
||||||
|
(*PTR)++;
|
||||||
|
}
|
||||||
|
if (negative)
|
||||||
|
{
|
||||||
|
return rval * -1;
|
||||||
|
}
|
||||||
|
//else
|
||||||
|
return rval;
|
||||||
|
}
|
@ -0,0 +1,103 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright (c) 2004, 2008 IBM Corporation
|
||||||
|
* All rights reserved.
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the BSD License
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial implementation
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
unsigned long int strtoul(const char *S, char **PTR,int BASE)
|
||||||
|
{
|
||||||
|
unsigned long rval = 0;
|
||||||
|
short int digit;
|
||||||
|
// *PTR is S, unless PTR is NULL, in which case i override it with my own ptr
|
||||||
|
char* ptr;
|
||||||
|
if (PTR == NULL)
|
||||||
|
{
|
||||||
|
//override
|
||||||
|
PTR = &ptr;
|
||||||
|
}
|
||||||
|
// i use PTR to advance through the string
|
||||||
|
*PTR = (char *) S;
|
||||||
|
//check if BASE is ok
|
||||||
|
if ((BASE < 0) || BASE > 36)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
// ignore white space at beginning of S
|
||||||
|
while ((**PTR == ' ')
|
||||||
|
|| (**PTR == '\t')
|
||||||
|
|| (**PTR == '\n')
|
||||||
|
|| (**PTR == '\r')
|
||||||
|
)
|
||||||
|
{
|
||||||
|
(*PTR)++;
|
||||||
|
}
|
||||||
|
// if BASE is 0... determine the base from the first chars...
|
||||||
|
if (BASE == 0)
|
||||||
|
{
|
||||||
|
// if S starts with "0x", BASE = 16, else 10
|
||||||
|
if ((**PTR == '0') && (*((*PTR)+1) == 'x'))
|
||||||
|
{
|
||||||
|
BASE = 16;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
BASE = 10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (BASE == 16)
|
||||||
|
{
|
||||||
|
// S may start with "0x"
|
||||||
|
if ((**PTR == '0') && (*((*PTR)+1) == 'x'))
|
||||||
|
{
|
||||||
|
(*PTR)++;
|
||||||
|
(*PTR)++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//until end of string
|
||||||
|
while (**PTR)
|
||||||
|
{
|
||||||
|
if (((**PTR) >= '0') && ((**PTR) <='9'))
|
||||||
|
{
|
||||||
|
//digit (0..9)
|
||||||
|
digit = **PTR - '0';
|
||||||
|
}
|
||||||
|
else if (((**PTR) >= 'a') && ((**PTR) <='z'))
|
||||||
|
{
|
||||||
|
//alphanumeric digit lowercase(a (10) .. z (35) )
|
||||||
|
digit = (**PTR - 'a') + 10;
|
||||||
|
}
|
||||||
|
else if (((**PTR) >= 'A') && ((**PTR) <='Z'))
|
||||||
|
{
|
||||||
|
//alphanumeric digit uppercase(a (10) .. z (35) )
|
||||||
|
digit = (**PTR - 'A') + 10;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//end of parseable number reached...
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (digit < BASE)
|
||||||
|
{
|
||||||
|
rval = (rval * BASE) + digit;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//digit found, but its too big for current base
|
||||||
|
//end of parseable number reached...
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
//next...
|
||||||
|
(*PTR)++;
|
||||||
|
}
|
||||||
|
//done
|
||||||
|
return rval;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,19 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright (c) 2004, 2008 IBM Corporation
|
||||||
|
* All rights reserved.
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the BSD License
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial implementation
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include <compiler.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
int __attrconst tolower(int c)
|
||||||
|
{
|
||||||
|
return (((c >= 'A') && (c <= 'Z')) ? (c - 'A' + 'a' ) : c);
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright (c) 2004, 2008 IBM Corporation
|
||||||
|
* All rights reserved.
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the BSD License
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial implementation
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include <compiler.h>
|
||||||
|
#include "ctype.h"
|
||||||
|
|
||||||
|
int __attrconst toupper (int cha)
|
||||||
|
{
|
||||||
|
if((cha >= 'a') && (cha <= 'z'))
|
||||||
|
return(cha - 'a' + 'A');
|
||||||
|
return(cha);
|
||||||
|
}
|
@ -0,0 +1,304 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Copyright (c) 2004, 2008 IBM Corporation
|
||||||
|
* All rights reserved.
|
||||||
|
* This program and the accompanying materials
|
||||||
|
* are made available under the terms of the BSD License
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.opensource.org/licenses/bsd-license.php
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM Corporation - initial implementation
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <compiler.h>
|
||||||
|
#include "stdio.h"
|
||||||
|
#include "stdlib.h"
|
||||||
|
#include "string.h"
|
||||||
|
#include "ctype.h"
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
static const unsigned long long convert[] = {
|
||||||
|
0x0, 0xFF, 0xFFFF, 0xFFFFFF, 0xFFFFFFFF,
|
||||||
|
0xFFFFFFFFFFULL, 0xFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFULL, 0xFFFFFFFFFFFFFFFFULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static int
|
||||||
|
print_str_fill(char **buffer, size_t bufsize, char *sizec,
|
||||||
|
const char *str, char c)
|
||||||
|
{
|
||||||
|
size_t i, sizei, len;
|
||||||
|
char *bstart = *buffer;
|
||||||
|
|
||||||
|
sizei = strtoul(sizec, NULL, 10);
|
||||||
|
len = strlen(str);
|
||||||
|
if (sizei > len) {
|
||||||
|
for (i = 0;
|
||||||
|
(i < (sizei - len)) && ((*buffer - bstart) < bufsize);
|
||||||
|
i++) {
|
||||||
|
**buffer = c;
|
||||||
|
*buffer += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
print_str(char **buffer, size_t bufsize, const char *str)
|
||||||
|
{
|
||||||
|
char *bstart = *buffer;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; (i < strlen(str)) && ((*buffer - bstart) < bufsize); i++) {
|
||||||
|
**buffer = str[i];
|
||||||
|
*buffer += 1;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static unsigned int __attrconst
|
||||||
|
print_intlen(unsigned long value, unsigned short int base)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
while (value > 0) {
|
||||||
|
if (base == 16)
|
||||||
|
value >>= 4;
|
||||||
|
else
|
||||||
|
value /= base;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if (i == 0)
|
||||||
|
i = 1;
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
print_itoa(char **buffer, size_t bufsize, unsigned long value,
|
||||||
|
unsigned short base, bool upper)
|
||||||
|
{
|
||||||
|
const char zeichen[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
|
||||||
|
char c;
|
||||||
|
int i, len;
|
||||||
|
|
||||||
|
if(base <= 2 || base > 16)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
len = i = print_intlen(value, base);
|
||||||
|
|
||||||
|
/* Don't print to buffer if bufsize is not enough. */
|
||||||
|
if (len > bufsize)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
do {
|
||||||
|
c = zeichen[value % base];
|
||||||
|
if (upper)
|
||||||
|
c = toupper(c);
|
||||||
|
|
||||||
|
(*buffer)[--i] = c;
|
||||||
|
value /= base;
|
||||||
|
} while(value);
|
||||||
|
|
||||||
|
*buffer += len;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
print_fill(char **buffer, size_t bufsize, char *sizec, unsigned long size,
|
||||||
|
unsigned short int base, char c, int optlen)
|
||||||
|
{
|
||||||
|
int i, sizei, len;
|
||||||
|
char *bstart = *buffer;
|
||||||
|
|
||||||
|
sizei = strtoul(sizec, NULL, 10);
|
||||||
|
len = print_intlen(size, base) + optlen;
|
||||||
|
if (sizei > len) {
|
||||||
|
for (i = 0;
|
||||||
|
(i < (sizei - len)) && ((*buffer - bstart) < bufsize);
|
||||||
|
i++) {
|
||||||
|
**buffer = c;
|
||||||
|
*buffer += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
print_format(char **buffer, size_t bufsize, const char *format, void *var)
|
||||||
|
{
|
||||||
|
char *start;
|
||||||
|
unsigned int i = 0, length_mod = sizeof(int);
|
||||||
|
unsigned long value = 0;
|
||||||
|
unsigned long signBit;
|
||||||
|
char *form, sizec[32];
|
||||||
|
char sign = ' ';
|
||||||
|
bool upper = false;
|
||||||
|
|
||||||
|
form = (char *) format;
|
||||||
|
start = *buffer;
|
||||||
|
|
||||||
|
form++;
|
||||||
|
if(*form == '0' || *form == '.') {
|
||||||
|
sign = '0';
|
||||||
|
form++;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((*form != '\0') && ((*buffer - start) < bufsize)) {
|
||||||
|
switch(*form) {
|
||||||
|
case 'u':
|
||||||
|
case 'd':
|
||||||
|
case 'i':
|
||||||
|
sizec[i] = '\0';
|
||||||
|
value = (unsigned long) var;
|
||||||
|
signBit = 0x1ULL << (length_mod * 8 - 1);
|
||||||
|
if ((*form != 'u') && (signBit & value)) {
|
||||||
|
**buffer = '-';
|
||||||
|
*buffer += 1;
|
||||||
|
value = (-(unsigned long)value) & convert[length_mod];
|
||||||
|
}
|
||||||
|
print_fill(buffer, bufsize - (*buffer - start),
|
||||||
|
sizec, value, 10, sign, 0);
|
||||||
|
print_itoa(buffer, bufsize - (*buffer - start),
|
||||||
|
value, 10, upper);
|
||||||
|
break;
|
||||||
|
case 'X':
|
||||||
|
upper = true;
|
||||||
|
/* fallthrough */
|
||||||
|
case 'x':
|
||||||
|
sizec[i] = '\0';
|
||||||
|
value = (unsigned long) var & convert[length_mod];
|
||||||
|
print_fill(buffer, bufsize - (*buffer - start),
|
||||||
|
sizec, value, 16, sign, 0);
|
||||||
|
print_itoa(buffer, bufsize - (*buffer - start),
|
||||||
|
value, 16, upper);
|
||||||
|
break;
|
||||||
|
case 'O':
|
||||||
|
case 'o':
|
||||||
|
sizec[i] = '\0';
|
||||||
|
value = (long int) var & convert[length_mod];
|
||||||
|
print_fill(buffer, bufsize - (*buffer - start),
|
||||||
|
sizec, value, 8, sign, 0);
|
||||||
|
print_itoa(buffer, bufsize - (*buffer - start),
|
||||||
|
value, 8, upper);
|
||||||
|
break;
|
||||||
|
case 'p':
|
||||||
|
sizec[i] = '\0';
|
||||||
|
print_fill(buffer, bufsize - (*buffer - start),
|
||||||
|
sizec, (unsigned long) var, 16, ' ', 2);
|
||||||
|
print_str(buffer, bufsize - (*buffer - start),
|
||||||
|
"0x");
|
||||||
|
print_itoa(buffer, bufsize - (*buffer - start),
|
||||||
|
(unsigned long) var, 16, upper);
|
||||||
|
break;
|
||||||
|
case 'c':
|
||||||
|
sizec[i] = '\0';
|
||||||
|
print_fill(buffer, bufsize - (*buffer - start),
|
||||||
|
sizec, 1, 10, ' ', 0);
|
||||||
|
**buffer = (unsigned long) var;
|
||||||
|
*buffer += 1;
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
sizec[i] = '\0';
|
||||||
|
print_str_fill(buffer,
|
||||||
|
bufsize - (*buffer - start), sizec,
|
||||||
|
(char *) var, ' ');
|
||||||
|
|
||||||
|
print_str(buffer, bufsize - (*buffer - start),
|
||||||
|
(char *) var);
|
||||||
|
break;
|
||||||
|
case 'l':
|
||||||
|
form++;
|
||||||
|
if(*form == 'l') {
|
||||||
|
length_mod = sizeof(long long int);
|
||||||
|
} else {
|
||||||
|
form--;
|
||||||
|
length_mod = sizeof(long int);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
|
form++;
|
||||||
|
if(*form == 'h') {
|
||||||
|
length_mod = sizeof(signed char);
|
||||||
|
} else {
|
||||||
|
form--;
|
||||||
|
length_mod = sizeof(short int);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'z':
|
||||||
|
length_mod = sizeof(size_t);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if(*form >= '0' && *form <= '9')
|
||||||
|
sizec[i++] = *form;
|
||||||
|
}
|
||||||
|
form++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return (long int) (*buffer - start);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The vsnprintf function prints a formatted strings into a buffer.
|
||||||
|
* BUG: buffer size checking does not fully work yet
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
vsnprintf(char *buffer, size_t bufsize, const char *format, va_list arg)
|
||||||
|
{
|
||||||
|
char *ptr, *bstart;
|
||||||
|
|
||||||
|
bstart = buffer;
|
||||||
|
ptr = (char *) format;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return from here if size passed is zero, otherwise we would
|
||||||
|
* overrun buffer while setting NULL character at the end.
|
||||||
|
*/
|
||||||
|
if (!buffer || !bufsize)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* Leave one space for NULL character */
|
||||||
|
bufsize--;
|
||||||
|
|
||||||
|
while(*ptr != '\0' && (buffer - bstart) < bufsize)
|
||||||
|
{
|
||||||
|
if(*ptr == '%') {
|
||||||
|
char formstr[20];
|
||||||
|
int i=0;
|
||||||
|
|
||||||
|
do {
|
||||||
|
formstr[i] = *ptr;
|
||||||
|
ptr++;
|
||||||
|
i++;
|
||||||
|
} while(!(*ptr == 'd' || *ptr == 'i' || *ptr == 'u' || *ptr == 'x' || *ptr == 'X'
|
||||||
|
|| *ptr == 'p' || *ptr == 'c' || *ptr == 's' || *ptr == '%'
|
||||||
|
|| *ptr == 'O' || *ptr == 'o' ));
|
||||||
|
formstr[i++] = *ptr;
|
||||||
|
formstr[i] = '\0';
|
||||||
|
if(*ptr == '%') {
|
||||||
|
*buffer++ = '%';
|
||||||
|
} else {
|
||||||
|
print_format(&buffer,
|
||||||
|
bufsize - (buffer - bstart),
|
||||||
|
formstr, va_arg(arg, void *));
|
||||||
|
}
|
||||||
|
ptr++;
|
||||||
|
} else {
|
||||||
|
|
||||||
|
*buffer = *ptr;
|
||||||
|
|
||||||
|
buffer++;
|
||||||
|
ptr++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*buffer = '\0';
|
||||||
|
|
||||||
|
return (buffer - bstart);
|
||||||
|
}
|
@ -0,0 +1,161 @@
|
|||||||
|
#include <stdint.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "stdio.h"
|
||||||
|
|
||||||
|
#include "io.h"
|
||||||
|
#include "microwatt_soc.h"
|
||||||
|
#include "console.h"
|
||||||
|
#include "elf64.h"
|
||||||
|
|
||||||
|
#define DTB_ADDR 0x01000000UL
|
||||||
|
#define DTBIMAGE_ADDR 0x00500000UL
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
#define debug(...) printf(__VA_ARGS__)
|
||||||
|
#else
|
||||||
|
#define debug(...) do {} while(0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int _printf(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
int count;
|
||||||
|
char buffer[128];
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
count = vsnprintf(buffer, sizeof(buffer), fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
puts(buffer);
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void flush_cpu_icache(void)
|
||||||
|
{
|
||||||
|
__asm__ volatile ("icbi 0,0; isync" : : : "memory");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void print_hex(unsigned long val)
|
||||||
|
{
|
||||||
|
int i, nibbles = sizeof(val)*2;
|
||||||
|
char buf[sizeof(val)*2+1];
|
||||||
|
|
||||||
|
for (i = nibbles-1; i >= 0; i--) {
|
||||||
|
buf[i] = (val & 0xf) + '0';
|
||||||
|
if (buf[i] > '9')
|
||||||
|
buf[i] += ('a'-'0'-10);
|
||||||
|
val >>= 4;
|
||||||
|
}
|
||||||
|
buf[nibbles] = '\0';
|
||||||
|
puts(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void fl_read(void *dst, uint32_t offset, uint32_t size)
|
||||||
|
{
|
||||||
|
memcpy(dst, (void *)(unsigned long)(SPI_FLASH_BASE + offset), size);
|
||||||
|
}
|
||||||
|
|
||||||
|
static unsigned long boot_flash(unsigned int offset)
|
||||||
|
{
|
||||||
|
Elf64_Ehdr ehdr;
|
||||||
|
Elf64_Phdr ph;
|
||||||
|
unsigned int i, poff, size, off;
|
||||||
|
void *addr;
|
||||||
|
|
||||||
|
fl_read(&ehdr, offset, sizeof(ehdr));
|
||||||
|
if (!IS_ELF(ehdr) || ehdr.e_ident[EI_CLASS] != ELFCLASS64) {
|
||||||
|
puts("Doesn't look like an elf64\n");
|
||||||
|
return -1UL;
|
||||||
|
}
|
||||||
|
if (ehdr.e_ident[EI_DATA] != ELFDATA2LSB ||
|
||||||
|
ehdr.e_machine != EM_PPC64) {
|
||||||
|
puts("Not a ppc64le binary\n");
|
||||||
|
return -1UL;
|
||||||
|
}
|
||||||
|
|
||||||
|
poff = offset + ehdr.e_phoff;
|
||||||
|
for (i = 0; i < ehdr.e_phnum; i++) {
|
||||||
|
fl_read(&ph, poff, sizeof(ph));
|
||||||
|
if (ph.p_type != PT_LOAD)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* XXX Add bound checking ! */
|
||||||
|
size = ph.p_filesz;
|
||||||
|
addr = (void *)ph.p_vaddr;
|
||||||
|
off = offset + ph.p_offset;
|
||||||
|
debug("Copy segment %d (0x%x bytes) to %p\n", i, size, addr);
|
||||||
|
fl_read(addr, off, size);
|
||||||
|
poff += ehdr.e_phentsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (poff == offset + ehdr.e_phoff) {
|
||||||
|
puts("Did not find any loadable sections\n");
|
||||||
|
return -1UL;
|
||||||
|
}
|
||||||
|
|
||||||
|
debug("Found entry point: %x\n", ehdr.e_entry);
|
||||||
|
|
||||||
|
flush_cpu_icache();
|
||||||
|
return ehdr.e_entry;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
unsigned long fl_off = 0;
|
||||||
|
potato_uart_init();
|
||||||
|
unsigned long payload, dtb;
|
||||||
|
void __attribute__((noreturn)) (*enter_kernel)(unsigned long fdt,
|
||||||
|
unsigned long entry,
|
||||||
|
unsigned long of);
|
||||||
|
|
||||||
|
|
||||||
|
puts("\nMicrowatt Loader ("__DATE__" "__TIME__"\n\n");
|
||||||
|
|
||||||
|
writeq(SYS_REG_CTRL_DRAM_AT_0, SYSCON_BASE + SYS_REG_CTRL);
|
||||||
|
flush_cpu_icache();
|
||||||
|
|
||||||
|
puts("Load binaries into SDRAM and select option to start:\n\n");
|
||||||
|
puts("vmlinux.bin and dtb:\n");
|
||||||
|
puts(" mw_debug -b jtag stop load vmlinux.bin load microwatt.dtb 0x1000000 start\n");
|
||||||
|
puts(" press 'l' to start'\n\n");
|
||||||
|
|
||||||
|
puts("dtbImage.microwatt:\n");
|
||||||
|
puts(" mw_debug -b jtag stop load dtbImage.microwatt 0x500000 start\n");
|
||||||
|
puts(" press 'w' to start'\n\n");
|
||||||
|
|
||||||
|
if (readq(SYSCON_BASE + SYS_REG_INFO) & SYS_REG_INFO_HAS_SPI_FLASH) {
|
||||||
|
unsigned long val = readq(SYSCON_BASE + SYS_REG_SPI_INFO);
|
||||||
|
fl_off = val & SYS_REG_SPI_INFO_FLASH_OFF_MASK;
|
||||||
|
|
||||||
|
puts("Flash:\n");
|
||||||
|
puts(" To boot a binary from flash, write it to "); print_hex(fl_off); puts("\n");
|
||||||
|
puts(" press 'f' to start'\n\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
switch (getchar()) {
|
||||||
|
case 'l':
|
||||||
|
payload = 0;
|
||||||
|
dtb = DTB_ADDR;
|
||||||
|
goto load;
|
||||||
|
case 'w':
|
||||||
|
payload = DTBIMAGE_ADDR;
|
||||||
|
goto load;
|
||||||
|
case 'f':
|
||||||
|
payload = boot_flash(fl_off);
|
||||||
|
if (payload == -1UL)
|
||||||
|
continue;
|
||||||
|
goto load;
|
||||||
|
default:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
load:
|
||||||
|
puts("Entering payload at "); print_hex(payload); puts("...\n");
|
||||||
|
|
||||||
|
enter_kernel = (void *)payload;
|
||||||
|
|
||||||
|
enter_kernel(dtb, 0, 0);
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
#include <microwatt_soc.h>
|
||||||
|
|
||||||
|
#define BASE_ADDR BRAM_BASE
|
||||||
|
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
. = BASE_ADDR;
|
||||||
|
.head : {
|
||||||
|
KEEP(*(.head))
|
||||||
|
}
|
||||||
|
|
||||||
|
.text : { *(.text*) *(.sfpr) *(.rodata*) }
|
||||||
|
.data : { *(.data*) }
|
||||||
|
.bss : { *(.bss*) }
|
||||||
|
|
||||||
|
/DISCARD/ : {
|
||||||
|
*(.note.*)
|
||||||
|
*(.comment)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue