mirror of
https://github.com/Fennix-Project/Userspace.git
synced 2025-05-28 15:34:26 +00:00
Updated init
This commit is contained in:
parent
123ae92e47
commit
f9ae9df392
@ -33,7 +33,7 @@ INCLUDE_DIR = ../../../out/system/include
|
|||||||
|
|
||||||
LDFLAGS := -Wl,-Map file.map
|
LDFLAGS := -Wl,-Map file.map
|
||||||
|
|
||||||
WARNCFLAG = -Wall -Wextra -Wno-builtin-declaration-mismatch
|
WARNCFLAG = -Wall -Wextra -Wmain
|
||||||
|
|
||||||
CFLAGS := \
|
CFLAGS := \
|
||||||
-I$(INCLUDE_DIR) \
|
-I$(INCLUDE_DIR) \
|
||||||
@ -41,17 +41,11 @@ CFLAGS := \
|
|||||||
-DGIT_COMMIT_SHORT='"$(GIT_COMMIT_SHORT)"'
|
-DGIT_COMMIT_SHORT='"$(GIT_COMMIT_SHORT)"'
|
||||||
|
|
||||||
ifeq ($(OSARCH), amd64)
|
ifeq ($(OSARCH), amd64)
|
||||||
|
|
||||||
CFLAGS += -march=x86-64 -fstack-protector-all -fstack-clash-protection
|
CFLAGS += -march=x86-64 -fstack-protector-all -fstack-clash-protection
|
||||||
|
|
||||||
else ifeq ($(OSARCH), i686)
|
else ifeq ($(OSARCH), i686)
|
||||||
|
|
||||||
CFLAGS += -march=i686
|
CFLAGS += -march=i686
|
||||||
|
|
||||||
else ifeq ($(OSARCH), aarch64)
|
else ifeq ($(OSARCH), aarch64)
|
||||||
|
|
||||||
CFLAGS += -pipe
|
CFLAGS += -pipe
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
build: $(FILENAME)
|
build: $(FILENAME)
|
||||||
@ -59,7 +53,7 @@ build: $(FILENAME)
|
|||||||
mv $(FILENAME) ../../../out/system/$(FILENAME)
|
mv $(FILENAME) ../../../out/system/$(FILENAME)
|
||||||
|
|
||||||
$(FILENAME): $(OBJ)
|
$(FILENAME): $(OBJ)
|
||||||
$(CC) $(LDFLAGS) $(SYSROOT) $(OBJ) -lssp -o $@
|
$(CC) $(LDFLAGS) $(SYSROOT) $(OBJ) -lssp -linit -o $@
|
||||||
|
|
||||||
%.o: %.c $(HEADERS)
|
%.o: %.c $(HEADERS)
|
||||||
$(info Compiling $<)
|
$(info Compiling $<)
|
||||||
|
@ -1,76 +1,21 @@
|
|||||||
#include "printf.h"
|
#include <stdlib.h>
|
||||||
|
#include <init.h>
|
||||||
|
#include <aux.h>
|
||||||
|
|
||||||
#define AT_NULL 0
|
|
||||||
#define AT_IGNORE 1
|
|
||||||
#define AT_EXECFD 2
|
|
||||||
#define AT_PHDR 3
|
|
||||||
#define AT_PHENT 4
|
|
||||||
#define AT_PHNUM 5
|
|
||||||
#define AT_PAGESZ 6
|
|
||||||
#define AT_BASE 7
|
|
||||||
#define AT_FLAGS 8
|
|
||||||
#define AT_ENTRY 9
|
|
||||||
#define AT_NOTELF 10
|
|
||||||
#define AT_UID 11
|
|
||||||
#define AT_EUID 12
|
|
||||||
#define AT_GID 13
|
|
||||||
#define AT_EGID 14
|
|
||||||
#define AT_PLATFORM 15
|
|
||||||
#define AT_HWCAP 16
|
|
||||||
#define AT_CLKTCK 17
|
|
||||||
#define AT_SECURE 23
|
|
||||||
#define AT_BASE_PLATFORM 24
|
|
||||||
#define AT_RANDOM 25
|
|
||||||
#define AT_HWCAP2 26
|
|
||||||
#define AT_EXECFN 31
|
|
||||||
#define AT_SYSINFO 32
|
|
||||||
#define AT_SYSINFO_EHDR 33
|
|
||||||
#define AT_L1I_CACHESHAPE 34
|
|
||||||
#define AT_L1D_CACHESHAPE 35
|
|
||||||
#define AT_L2_CACHESHAPE 36
|
|
||||||
#define AT_L3_CACHESHAPE 37
|
|
||||||
#define AT_L1I_CACHESIZE 40
|
|
||||||
#define AT_L1I_CACHEGEOMETRY 41
|
|
||||||
#define AT_L1D_CACHESIZE 42
|
|
||||||
#define AT_L1D_CACHEGEOMETRY 43
|
|
||||||
#define AT_L2_CACHESIZE 44
|
|
||||||
#define AT_L2_CACHEGEOMETRY 45
|
|
||||||
#define AT_L3_CACHESIZE 46
|
|
||||||
#define AT_L3_CACHEGEOMETRY 47
|
|
||||||
#define AT_MINSIGSTKSZ 51
|
|
||||||
|
|
||||||
typedef struct
|
#define print(m, ...) init_log(m, ##__VA_ARGS__)
|
||||||
{
|
|
||||||
unsigned long a_type;
|
|
||||||
union
|
|
||||||
{
|
|
||||||
unsigned long a_val;
|
|
||||||
} a_un;
|
|
||||||
} Elf64_auxv_t;
|
|
||||||
|
|
||||||
static inline long syscall2(int sc, long arg1, long arg2)
|
|
||||||
{
|
|
||||||
long ret;
|
|
||||||
__asm__ __volatile__("syscall"
|
|
||||||
: "=a"(ret)
|
|
||||||
: "a"(sc), "D"(arg1), "S"(arg2)
|
|
||||||
: "rcx", "r11", "memory");
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
void putchar(char c) { syscall2(1, c, 0); }
|
|
||||||
|
|
||||||
int main(int argc, char *argv[], int envc, char *envp[])
|
int main(int argc, char *argv[], int envc, char *envp[])
|
||||||
{
|
{
|
||||||
printf_("Hello World!\n");
|
print("Hello World!\n");
|
||||||
printf_("%p %p %p %p\n", argc, argv, envc, envp);
|
print("%p %p %p %p\n", argc, argv, envc, envp);
|
||||||
printf_("I have %d arguments\n", argc);
|
print("I have %d arguments\n", argc);
|
||||||
for (int i = 0; i < argc; i++)
|
for (int i = 0; i < argc; i++)
|
||||||
printf_("argv[%d] = (%p) %s\n", i, argv[i], argv[i]);
|
print("argv[%d] = (%p) %s\n", i, argv[i], argv[i]);
|
||||||
|
|
||||||
printf_("I have %d environment variables\n", envc);
|
print("I have %d environment variables\n", envc);
|
||||||
for (int i = 0; i < envc; i++)
|
for (int i = 0; i < envc; i++)
|
||||||
printf_("envp[%d] = (%p) %s\n", i, envp[i], envp[i]);
|
print("envp[%d] = (%p) %s\n", i, envp[i], envp[i]);
|
||||||
Elf64_auxv_t *auxv;
|
Elf64_auxv_t *auxv;
|
||||||
while (*envp++ != NULL)
|
while (*envp++ != NULL)
|
||||||
;
|
;
|
||||||
@ -78,7 +23,12 @@ int main(int argc, char *argv[], int envc, char *envp[])
|
|||||||
int i = 0;
|
int i = 0;
|
||||||
for (auxv = (Elf64_auxv_t *)envp; auxv->a_type != AT_NULL; auxv++)
|
for (auxv = (Elf64_auxv_t *)envp; auxv->a_type != AT_NULL; auxv++)
|
||||||
{
|
{
|
||||||
printf_("%lu :%d\n", (auxv->a_type), i++);
|
print("%lu :%d\n", (auxv->a_type), i++);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This code somehow breaks the process. How? I can't figure it out if it's a bug in the kernel or in the libc.
|
||||||
|
void *yes = malloc(0x100);
|
||||||
|
print("malloc(0x100) = %p\n", yes);
|
||||||
|
free(yes);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,194 +0,0 @@
|
|||||||
/**
|
|
||||||
* @author (c) Eyal Rozenberg <eyalroz1@gmx.com>
|
|
||||||
* 2021-2022, Haifa, Palestine/Israel
|
|
||||||
* @author (c) Marco Paland (info@paland.com)
|
|
||||||
* 2014-2019, PALANDesign Hannover, Germany
|
|
||||||
*
|
|
||||||
* @note Others have made smaller contributions to this file: see the
|
|
||||||
* contributors page at https://github.com/eyalroz/printf/graphs/contributors
|
|
||||||
* or ask one of the authors.
|
|
||||||
*
|
|
||||||
* @brief Small stand-alone implementation of the printf family of functions
|
|
||||||
* (`(v)printf`, `(v)s(n)printf` etc., geared towards use on embedded systems with
|
|
||||||
* a very limited resources.
|
|
||||||
*
|
|
||||||
* @note the implementations are thread-safe; re-entrant; use no functions from
|
|
||||||
* the standard library; and do not dynamically allocate any memory.
|
|
||||||
*
|
|
||||||
* @license The MIT License (MIT)
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef PRINTF_H_
|
|
||||||
#define PRINTF_H_
|
|
||||||
|
|
||||||
#include <types.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C"
|
|
||||||
{
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __GNUC__
|
|
||||||
#define ATTR_PRINTF(one_based_format_index, first_arg) \
|
|
||||||
__attribute__((format(__printf__, (one_based_format_index), (first_arg))))
|
|
||||||
#define ATTR_VPRINTF(one_based_format_index) ATTR_PRINTF((one_based_format_index), 0)
|
|
||||||
#else
|
|
||||||
#define ATTR_PRINTF((one_based_format_index), (first_arg))
|
|
||||||
#define ATTR_VPRINTF(one_based_format_index)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef PRINTF_ALIAS_STANDARD_FUNCTION_NAMES
|
|
||||||
#define PRINTF_ALIAS_STANDARD_FUNCTION_NAMES 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if PRINTF_ALIAS_STANDARD_FUNCTION_NAMES
|
|
||||||
#define printf_ printf
|
|
||||||
#define sprintf_ sprintf
|
|
||||||
#define vsprintf_ vsprintf
|
|
||||||
#define snprintf_ snprintf
|
|
||||||
#define vsnprintf_ vsnprintf
|
|
||||||
#define vprintf_ vprintf
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// If you want to include this implementation file directly rather than
|
|
||||||
// link against, this will let you control the functions' visibility,
|
|
||||||
// e.g. make them static so as not to clash with other objects also
|
|
||||||
// using them.
|
|
||||||
#ifndef PRINTF_VISIBILITY
|
|
||||||
#define PRINTF_VISIBILITY
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Prints/send a single character to some opaque output entity
|
|
||||||
*
|
|
||||||
* @note This function is not implemented by the library, only declared; you must provide an
|
|
||||||
* implementation if you wish to use the @ref printf / @ref vprintf function (and possibly
|
|
||||||
* for linking against the library, if your toolchain does not support discarding unused functions)
|
|
||||||
*
|
|
||||||
* @note The output could be as simple as a wrapper for the `write()` system call on a Unix-like
|
|
||||||
* system, or even libc's @ref putchar , for replicating actual functionality of libc's @ref printf
|
|
||||||
* function; but on an embedded system it may involve interaction with a special output device,
|
|
||||||
* like a UART, etc.
|
|
||||||
*
|
|
||||||
* @note in libc's @ref putchar, the parameter type is an int; this was intended to support the
|
|
||||||
* representation of either a proper character or EOF in a variable - but this is really not
|
|
||||||
* meaningful to pass into @ref putchar and is discouraged today. See further discussion in:
|
|
||||||
* @link https://stackoverflow.com/q/17452847/1593077
|
|
||||||
*
|
|
||||||
* @param c the single character to print
|
|
||||||
*/
|
|
||||||
PRINTF_VISIBILITY
|
|
||||||
void putchar(char c);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An implementation of the C standard's printf/vprintf
|
|
||||||
*
|
|
||||||
* @note you must implement a @ref putchar_ function for using this function - it invokes @ref putchar_
|
|
||||||
* rather than directly performing any I/O (which insulates it from any dependence on the operating system
|
|
||||||
* and external libraries).
|
|
||||||
*
|
|
||||||
* @param format A string specifying the format of the output, with %-marked specifiers of how to interpret
|
|
||||||
* additional arguments.
|
|
||||||
* @param arg Additional arguments to the function, one for each %-specifier in @p format string
|
|
||||||
* @return The number of characters written into @p s, not counting the terminating null character
|
|
||||||
*/
|
|
||||||
///@{
|
|
||||||
PRINTF_VISIBILITY
|
|
||||||
int printf_(const char *format, ...) ATTR_PRINTF(1, 2);
|
|
||||||
PRINTF_VISIBILITY
|
|
||||||
int vprintf_(const char *format, va_list arg) ATTR_VPRINTF(1);
|
|
||||||
///@}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An implementation of the C standard's sprintf/vsprintf
|
|
||||||
*
|
|
||||||
* @note For security considerations (the potential for exceeding the buffer bounds), please consider using
|
|
||||||
* the size-constrained variant, @ref snprintf / @ref vsnprintf , instead.
|
|
||||||
*
|
|
||||||
* @param s An array in which to store the formatted string. It must be large enough to fit the formatted
|
|
||||||
* output!
|
|
||||||
* @param format A string specifying the format of the output, with %-marked specifiers of how to interpret
|
|
||||||
* additional arguments.
|
|
||||||
* @param arg Additional arguments to the function, one for each specifier in @p format
|
|
||||||
* @return The number of characters written into @p s, not counting the terminating null character
|
|
||||||
*/
|
|
||||||
///@{
|
|
||||||
PRINTF_VISIBILITY
|
|
||||||
int sprintf_(char *s, const char *format, ...) ATTR_PRINTF(2, 3);
|
|
||||||
PRINTF_VISIBILITY
|
|
||||||
int vsprintf_(char *s, const char *format, va_list arg) ATTR_VPRINTF(2);
|
|
||||||
///@}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An implementation of the C standard's snprintf/vsnprintf
|
|
||||||
*
|
|
||||||
* @param s An array in which to store the formatted string. It must be large enough to fit either the
|
|
||||||
* entire formatted output, or at least @p n characters. Alternatively, it can be NULL, in which case
|
|
||||||
* nothing will be printed, and only the number of characters which _could_ have been printed is
|
|
||||||
* tallied and returned.
|
|
||||||
* @param n The maximum number of characters to write to the array, including a terminating null character
|
|
||||||
* @param format A string specifying the format of the output, with %-marked specifiers of how to interpret
|
|
||||||
* additional arguments.
|
|
||||||
* @param arg Additional arguments to the function, one for each specifier in @p format
|
|
||||||
* @return The number of characters that COULD have been written into @p s, not counting the terminating
|
|
||||||
* null character. A value equal or larger than @p n indicates truncation. Only when the returned value
|
|
||||||
* is non-negative and less than @p n, the null-terminated string has been fully and successfully printed.
|
|
||||||
*/
|
|
||||||
///@{
|
|
||||||
PRINTF_VISIBILITY
|
|
||||||
int snprintf_(char *s, size_t count, const char *format, ...) ATTR_PRINTF(3, 4);
|
|
||||||
PRINTF_VISIBILITY
|
|
||||||
int vsnprintf_(char *s, size_t count, const char *format, va_list arg) ATTR_VPRINTF(3);
|
|
||||||
///@}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* printf/vprintf with user-specified output function
|
|
||||||
*
|
|
||||||
* An alternative to @ref printf_, in which the output function is specified dynamically
|
|
||||||
* (rather than @ref putchar_ being used)
|
|
||||||
*
|
|
||||||
* @param out An output function which takes one character and a type-erased additional parameters
|
|
||||||
* @param extra_arg The type-erased argument to pass to the output function @p out with each call
|
|
||||||
* @param format A string specifying the format of the output, with %-marked specifiers of how to interpret
|
|
||||||
* additional arguments.
|
|
||||||
* @param arg Additional arguments to the function, one for each specifier in @p format
|
|
||||||
* @return The number of characters for which the output f unction was invoked, not counting the terminating null character
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
PRINTF_VISIBILITY
|
|
||||||
int fctprintf(void (*out)(char c, void *extra_arg), void *extra_arg, const char *format, ...) ATTR_PRINTF(3, 4);
|
|
||||||
PRINTF_VISIBILITY
|
|
||||||
int vfctprintf(void (*out)(char c, void *extra_arg), void *extra_arg, const char *format, va_list arg) ATTR_VPRINTF(3);
|
|
||||||
|
|
||||||
#if PRINTF_ALIAS_STANDARD_FUNCTION_NAMES
|
|
||||||
#undef printf_
|
|
||||||
#undef sprintf_
|
|
||||||
#undef vsprintf_
|
|
||||||
#undef snprintf_
|
|
||||||
#undef vsnprintf_
|
|
||||||
#undef vprintf_
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // PRINTF_H_
|
|
Loading…
x
Reference in New Issue
Block a user