riscv64: Fill in more bulk architecture items around libroot/kernel

Change-Id: Ia2a86d8814d06950ea2d2d19d966c642d26f81d6
Reviewed-on: https://review.haiku-os.org/c/1302
Reviewed-by: Alex von Gluck IV <[email protected]>
Reviewed-by: Adrien Destugues <[email protected]>
This commit is contained in:
Alexander von Gluck IV
2019-03-25 17:16:03 +00:00
committed by Alex von Gluck IV
parent 7f94422796
commit c085f38639
34 changed files with 1847 additions and 5 deletions
@@ -0,0 +1,41 @@
/*
* Copyright 2018-2019, Haiku, Inc. All rights reserved
* Distributed under the terms of the MIT License.
*
* Authors:
* Alexander von Gluck IV <[email protected]>
*/
#ifndef _SYSTEM_ARCH_RISCV64_DEFS_H
#define _SYSTEM_ARCH_RISCV64_DEFS_H
#define SPINLOCK_PAUSE() do {} while (false)
// Status register flags
#define ARCH_SR_SIE 0x00000002 // Supervisor Interrupt Enable
#define ARCH_SR_SPIE 0x00000020 // Previous Supervisor Interrupt En
#define ARCH_SR_SPP 0x00000100 // Previously Supervisor
#define ARCH_SR_SUM 0x00040000 // Supervisor may access user memory
#define ARCH_SR_FS 0x00006000 // Floating Point Status
#define ARCH_SR_FS_OFF 0x00000000
#define ARCH_SR_FS_INITIAL 0x00002000
#define ARCH_SR_FS_CLEAN 0x00004000
#define ARCH_SR_FS_DIRTY 0x00006000
#define ARCH_SR_XS 0x00018000 // Extension Status
#define ARCH_SR_XS_OFF 0x00000000
#define ARCH_SR_XS_INITIAL 0x00008000
#define ARCH_SR_XS_CLEAN 0x00010000
#define ARCH_SR_XS_DIRTY 0x00018000
#define ARCH_SR_SD 0x8000000000000000 // FS/XS dirty
// Interrupt Enable and Interrupt Pending
#define ARCH_SIE_SSIE 0x00000002 // Software Interrupt Enable
#define ARCH_SIE_STIE 0x00000020 // Timer Interrupt Enable
#define ARCH_SIE_SEIE 0x00000200 // External Interrupt Enable
#endif /* _SYSTEM_ARCH_RISCV64_DEFS_H */
@@ -0,0 +1,19 @@
/*
* Copyright 2008, François Revol, [email protected].
* Distributed under the terms of the MIT License.
*/
#ifndef SYSTEM_ARCH_RISCV64_ASM_DEFS_H
#define SYSTEM_ARCH_RISCV64_ASM_DEFS_H
/* include arch version helpers */
//#include <arch_riscv64_version.h>
#define SYMBOL(name) .global name; name
#define SYMBOL_END(name) 1: .size name, 1b - name
#define STATIC_FUNCTION(name) .type name, %function; name
#define FUNCTION(name) .global name; .type name, %function; name
#define FUNCTION_END(name) 1: .size name, 1b - name
#endif /* SYSTEM_ARCH_RISCV64_ASM_DEFS_H */
+135
View File
@@ -0,0 +1,135 @@
name haiku
version %HAIKU_VERSION%
architecture riscv64
summary "The Haiku base system"
description "The Haiku base system includes all system core software, like
boot loader, kernel, the system libraries, servers, and applications."
packager "The Haiku build system"
vendor "Haiku Project"
copyrights "2001-2019 Haiku, Inc. et al"
licenses {
MIT
"GNU LGPL v2.1"
}
flags system_package
provides {
haiku=%HAIKU_VERSION% compat>=R1~beta1
cmd:arp
cmd:chop
cmd:clear
cmd:compress
cmd:df
cmd:ftp
cmd:ftpd
cmd:hd
cmd:hey
cmd:login
cmd:more
cmd:passwd
cmd:ping
cmd:ping6
cmd:prio
cmd:ps
cmd:renice
cmd:resattr
cmd:su
cmd:telnet
cmd:telnetd
cmd:top
cmd:tput
cmd:traceroute
cmd:trash
cmd:unchop
cmd:useradd
cmd:watch
cmd:xres
}
requires {
coreutils
cmd:sh
#ifdef HAIKU_REGULAR_BUILD
cmd:bunzip2
cmd:gunzip
cmd:tar
cmd:unzip
#endif
lib:libfreetype
#ifdef HAIKU_BUILD_FEATURE_RISCV64_FONTCONFIG_ENABLED
lib:libfontconfig
#endif
lib:libgcc_s
lib:libicudata >= 57
lib:libicui18n >= 57
lib:libicuio >= 57
lib:libicule >= 57
lib:libiculx >= 57
lib:libicutest >= 57
lib:libicutu >= 57
lib:libicuuc >= 57
lib:libncurses >= 6.0
#ifdef HAIKU_REGULAR_BUILD
#ifdef HAIKU_BUILD_FEATURE_RISCV64_EXPAT_ENABLED
lib:libexpat
#endif
#ifdef HAIKU_BUILD_FEATURE_RISCV64_GUTENPRINT_ENABLED
lib:libgutenprint
#endif
#ifdef HAIKU_BUILD_FEATURE_RISCV64_LIBICNS_ENABLED
lib:libicns
#endif
#ifdef HAIKU_BUILD_FEATURE_RISCV64_JASPER_ENABLED
lib:libjasper
#endif
#ifdef HAIKU_BUILD_FEATURE_RISCV64_JPEG_ENABLED
lib:libjpeg
#endif
#ifdef HAIKU_BUILD_FEATURE_RISCV64_LIBPNG_ENABLED
lib:libpng >= 16.0
#endif
#ifdef HAIKU_BUILD_FEATURE_RISCV64_TIFF_ENABLED
lib:libtiff >= 5.2
#endif
#ifdef HAIKU_BUILD_FEATURE_RISCV64_LIBWEBP_ENABLED
lib:libwebp
#endif
#ifdef HAIKU_BUILD_FEATURE_RISCV64_ILMBASE_ENABLED
lib:libhalf
lib:libiex
lib:libiexmath
lib:libilmthread
lib:libimath
#endif
#ifdef HAIKU_BUILD_FEATURE_RISCV64_OPENEXR_ENABLED
lib:libilmimf
lib:libilmimfutil
#endif
#ifdef HAIKU_BUILD_FEATURE_RISCV64_OPENSSL_ENABLED
lib:libssl >= 1.0.0
lib:libcrypto >= 1.0.0
#endif
#ifdef HAIKU_BUILD_FEATURE_RISCV64_FFMPEG_ENABLED
lib:libavcodec >= 58
lib:libavfilter >= 7
lib:libavformat >= 58
lib:libavutil >= 56
lib:libswresample >= 3
#endif
#ifdef HAIKU_BUILD_FEATURE_RISCV64_ZSTD_ENABLED
lib:libzstd >= 1
#endif
#endif
lib:libsolv
lib:libsolvext
lib:libstdc++
lib:libsupc++
lib:libz
noto
#ifdef HAIKU_REGULAR_BUILD
noto_sans_cjk_jp
#endif
}
@@ -0,0 +1,52 @@
/*
* Copyright 2005, Ingo Weinhold, [email protected].
* Copyright 2012, Alex Smith, [email protected].
* Distributed under the terms of the MIT License.
*/
#include <debug_support.h>
#include "arch_debug_support.h"
struct stack_frame {
struct stack_frame *previous;
void *return_address;
};
status_t
arch_debug_get_instruction_pointer(debug_context *context, thread_id thread,
void **ip, void **stackFrameAddress)
{
// get the CPU state
debug_cpu_state cpuState;
status_t error = debug_get_cpu_state(context, thread, NULL, &cpuState);
if (error != B_OK)
return error;
*ip = (void*)cpuState.rip;
*stackFrameAddress = (void*)cpuState.rbp;
return B_OK;
}
status_t
arch_debug_get_stack_frame(debug_context *context, void *stackFrameAddress,
debug_stack_frame_info *stackFrameInfo)
{
stack_frame stackFrame;
ssize_t bytesRead = debug_read_memory(context, stackFrameAddress,
&stackFrame, sizeof(stackFrame));
if (bytesRead < B_OK)
return bytesRead;
if (bytesRead != sizeof(stackFrame))
return B_ERROR;
stackFrameInfo->frame = stackFrameAddress;
stackFrameInfo->parent_frame = stackFrame.previous;
stackFrameInfo->return_address = stackFrame.return_address;
return B_OK;
}
+33
View File
@@ -0,0 +1,33 @@
SubDir HAIKU_TOP src system boot arch riscv64 ;
{
local defines = _BOOT_MODE ;
defines = [ FDefines $(defines) ] ;
SubDirCcFlags $(defines) ;
SubDirC++Flags $(defines) -fno-rtti ;
}
local kernelLibArchObjects =
<src!system!kernel!lib!arch!$(TARGET_ARCH)>byteorder.o
<src!system!kernel!lib!arch!$(TARGET_ARCH)>memcpy.o
<src!system!kernel!lib!arch!$(TARGET_ARCH)>memset.o
;
BootMergeObject boot_arch_$(TARGET_KERNEL_ARCH).o :
debug_uart_8250.cpp
#arch_uart_8250.cpp
arch_elf.cpp
: # additional flags
:
$(kernelArchObjects)
$(kernelLibArchObjects)
;
SEARCH on [ FGristFiles arch_elf.cpp arch_uart_8250.cpp ]
= [ FDirName $(HAIKU_TOP) src system kernel arch $(TARGET_KERNEL_ARCH) ] ;
SEARCH on [ FGristFiles debug_uart_8250.cpp ]
= [ FDirName $(HAIKU_TOP) src system kernel arch generic ] ;
+22
View File
@@ -2,3 +2,25 @@ SubDir HAIKU_TOP src system kernel arch riscv64 ;
SubDirHdrs $(SUBDIR) $(DOTDOT) generic ; SubDirHdrs $(SUBDIR) $(DOTDOT) generic ;
UsePrivateKernelHeaders ; UsePrivateKernelHeaders ;
KernelMergeObject kernel_arch_riscv64.o :
arch_asm.S
arch_commpage.cpp
arch_cpu.cpp
arch_debug.cpp
arch_debug_console.cpp
arch_elf.cpp
arch_int.cpp
arch_platform.cpp
arch_real_time_clock.cpp
arch_smp.cpp
arch_system_info.cpp
arch_timer.cpp
arch_thread.cpp
arch_user_debugger.cpp
arch_vm.cpp
arch_vm_translation_map.cpp
:
$(TARGET_KERNEL_PIC_CCFLAGS) -Wno-unused
:
;
+66
View File
@@ -0,0 +1,66 @@
/*
* Copyright 2019, Haiku, Inc. All Rights Reserved
* Distributed under the terms of the MIT License.
*/
#include <asm_defs.h>
#include <arch_cpu_defs.h>
.text
#warning TODO: Fix overly simplistic IRQ
/* void arch_int_enable_interrupts(void) */
FUNCTION(arch_int_enable_interrupts):
// TODO
csrs sstatus, ARCH_SR_SIE
ret
FUNCTION_END(arch_int_enable_interrupts)
/* int arch_int_disable_interrupts(void)
*/
FUNCTION(arch_int_disable_interrupts):
csrrc 0, sstatus, ARCH_SR_SIE
// TODO
ret
FUNCTION_END(arch_int_disable_interrupts)
/* void arch_int_restore_interrupts(int oldState)
*/
FUNCTION(arch_int_restore_interrupts):
// TODO
ret
FUNCTION_END(arch_int_restore_interrupts)
/* bool arch_int_are_interrupts_enabled(void) */
FUNCTION(arch_int_are_interrupts_enabled):
// TODO
ret
FUNCTION_END(arch_int_are_interrupts_enabled)
/* status_t arch_cpu_user_memcpy(void *to, const void *from, size_t size, addr_t *faultHandler) */
FUNCTION(_arch_cpu_user_memcpy):
// TODO
ret
FUNCTION_END(_arch_cpu_user_memcpy)
/* status_t arch_cpu_user_memset(void *to, char c, size_t count, addr_t *faultHandler) */
FUNCTION(_arch_cpu_user_memset):
// TODO
ret
FUNCTION_END(_arch_cpu_user_memset)
/* ssize_t arch_cpu_user_strlcpy(void *to, const void *from, size_t size, addr_t *faultHandler) */
FUNCTION(_arch_cpu_user_strlcpy):
// TODO
ret
FUNCTION_END(_arch_cpu_user_strlcpy)
@@ -0,0 +1,29 @@
/*
* Copyright 2007, Travis Geiselbrecht. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#include <commpage.h>
#include <string.h>
#include <KernelExport.h>
#include <cpu.h>
#include <elf.h>
#include <smp.h>
status_t
arch_commpage_init(void)
{
return B_OK;
}
status_t
arch_commpage_init_post_cpus(void)
{
return B_OK;
}
@@ -0,0 +1,99 @@
/*
* Copyright 2019, Adrien Destugues, [email protected].
* Distributed under the terms of the MIT License.
*/
#include <KernelExport.h>
#include <arch/cpu.h>
#include <boot/kernel_args.h>
#include <commpage.h>
#include <elf.h>
status_t
arch_cpu_preboot_init_percpu(kernel_args *args, int curr_cpu)
{
return B_OK;
}
status_t
arch_cpu_init_percpu(kernel_args *args, int curr_cpu)
{
//detect_cpu(curr_cpu);
// we only support one anyway...
return 0;
}
status_t
arch_cpu_init(kernel_args *args)
{
return B_OK;
}
status_t
arch_cpu_init_post_vm(kernel_args *args)
{
return B_OK;
}
status_t
arch_cpu_init_post_modules(kernel_args *args)
{
return B_OK;
}
void
arch_cpu_sync_icache(void *address, size_t len)
{
}
void
arch_cpu_memory_read_barrier(void)
{
}
void
arch_cpu_memory_write_barrier(void)
{
}
void
arch_cpu_invalidate_TLB_range(addr_t start, addr_t end)
{
}
void
arch_cpu_invalidate_TLB_list(addr_t pages[], int num_pages)
{
}
void
arch_cpu_global_TLB_invalidate(void)
{
}
void
arch_cpu_user_TLB_invalidate(void)
{
}
status_t
arch_cpu_shutdown(bool reboot)
{
return B_ERROR;
}
@@ -0,0 +1,106 @@
/*
* Copyright 2019, Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* Adrien Destugues <[email protected]>
*/
#include <arch/debug.h>
void
arch_debug_stack_trace(void)
{
}
bool
arch_debug_contains_call(Thread *thread, const char *symbol,
addr_t start, addr_t end)
{
return false;
}
void *
arch_debug_get_caller(void)
{
return NULL;
}
void
arch_debug_save_registers(struct arch_debug_registers* registers)
{
}
void
arch_debug_call_with_fault_handler(cpu_ent* cpu, jmp_buf jumpBuffer,
void (*function)(void*), void* parameter)
{
}
bool
arch_is_debug_variable_defined(const char* variableName)
{
// TODO: Implement!
return false;
}
status_t
arch_set_debug_variable(const char* variableName, uint64 value)
{
// TODO: Implement!
return B_ENTRY_NOT_FOUND;
}
status_t
arch_get_debug_variable(const char* variableName, uint64* value)
{
// TODO: Implement!
return B_ENTRY_NOT_FOUND;
}
int32
arch_debug_get_stack_trace(addr_t* returnAddresses, int32 maxCount,
int32 skipIframes, int32 skipFrames, uint32 flags)
{
return 0;
}
ssize_t
arch_debug_gdb_get_registers(char* buffer, size_t bufferSize)
{
// TODO: Implement!
return B_NOT_SUPPORTED;
}
void*
arch_debug_get_interrupt_pc(bool* _isSyscall)
{
// TODO: Implement!
return NULL;
}
status_t
arch_debug_init(kernel_args *args)
{
#if 0
add_debugger_command("where", &stack_trace, "Same as \"sc\"");
add_debugger_command("bt", &stack_trace, "Same as \"sc\" (as in gdb)");
add_debugger_command("sc", &stack_trace, "Stack crawl for current thread");
#endif
return B_NO_ERROR;
}
@@ -0,0 +1,95 @@
/*
* Copyright 2003-2006, Axel Dörfler, [email protected].
* Distributed under the terms of the MIT License.
*
* Copyright 2001, Travis Geiselbrecht. All rights reserved.
* Distributed under the terms of the NewOS License.
*/
#include <arch/debug_console.h>
#include <boot/kernel_args.h>
#include <kernel.h>
#include <vm/vm.h>
#include <string.h>
void
arch_debug_remove_interrupt_handler(uint32 line)
{
}
void
arch_debug_install_interrupt_handlers(void)
{
}
int
arch_debug_blue_screen_try_getchar(void)
{
return 0;
}
char
arch_debug_blue_screen_getchar(void)
{
return 0;
}
int
arch_debug_serial_try_getchar(void)
{
// TODO: Implement correctly!
return arch_debug_serial_getchar();
}
char
arch_debug_serial_getchar(void)
{
return 0;
}
void
arch_debug_serial_putchar(const char c)
{
}
void
arch_debug_serial_puts(const char *s)
{
while (*s != '\0') {
arch_debug_serial_putchar(*s);
s++;
}
}
void
arch_debug_serial_early_boot_message(const char *string)
{
// this function will only be called in fatal situations
}
status_t
arch_debug_console_init(kernel_args *args)
{
return B_OK;
}
status_t
arch_debug_console_init_settings(kernel_args *args)
{
return B_OK;
}
@@ -0,0 +1,99 @@
/*
* Copyright 2019, Adrien Destugues <[email protected]>
* Copyright 2010, Ithamar R. Adema <[email protected]>
* Copyright 2009, Johannes Wischert, [email protected].
* Copyright 2005, Ingo Weinhold <[email protected]>.
* Copyright 2002, Travis Geiselbrecht. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#include <KernelExport.h>
#include <elf_priv.h>
#include <arch/elf.h>
//#define TRACE_ARCH_ELF
#ifdef TRACE_ARCH_ELF
# define TRACE(x) dprintf x
# define CHATTY 1
#else
# define TRACE(x) ;
# define CHATTY 0
#endif
#ifndef _BOOT_MODE
static bool
is_in_image(struct elf_image_info *image, addr_t address)
{
return (address >= image->text_region.start
&& address < image->text_region.start + image->text_region.size)
|| (address >= image->data_region.start
&& address < image->data_region.start + image->data_region.size);
}
#endif // !_BOOT_MODE
int
arch_elf_relocate_rel(struct elf_image_info *image,
struct elf_image_info *resolve_image, Elf64_Rel *rel, int rel_len)
{
// TODO: rel entries in RISCV64 elf
return B_NO_ERROR;
}
static inline void
write_32(addr_t P, Elf32_Word value)
{
*(Elf32_Word*)P = value;
}
static inline void
write_16(addr_t P, Elf32_Word value)
{
// bits 16:29
*(Elf32_Half*)P = (Elf32_Half)value;
}
static inline bool
write_16_check(addr_t P, Elf32_Word value)
{
// bits 15:0
if ((value & 0xffff0000) && (~value & 0xffff8000))
return false;
*(Elf32_Half*)P = (Elf32_Half)value;
return true;
}
static inline bool
write_8(addr_t P, Elf32_Word value)
{
// bits 7:0
*(uint8 *)P = (uint8)value;
return true;
}
static inline bool
write_8_check(addr_t P, Elf32_Word value)
{
// bits 7:0
if ((value & 0xffffff00) && (~value & 0xffffff80))
return false;
*(uint8 *)P = (uint8)value;
return true;
}
int
arch_elf_relocate_rela(struct elf_image_info *image,
struct elf_image_info *resolve_image, Elf64_Rela *rel, int rel_len)
{
return B_OK;
}
@@ -0,0 +1,56 @@
/*
* Copyright 2003-2011, Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* Adrien Destugues, [email protected]
*/
#include <int.h>
status_t
arch_int_init(kernel_args *args)
{
return B_OK;
}
status_t
arch_int_init_post_vm(kernel_args *args)
{
return B_OK;
}
status_t
arch_int_init_post_device_manager(struct kernel_args *args)
{
return B_OK;
}
status_t
arch_int_init_io(kernel_args* args)
{
return B_OK;
}
void
arch_int_enable_io_interrupt(int irq)
{
}
void
arch_int_disable_io_interrupt(int irq)
{
}
void
arch_int_assign_to_cpu(int32 irq, int32 cpu)
{
}
@@ -0,0 +1,27 @@
/* Copyright 2019, Adrien Destugues, [email protected].
* Distributed under the terms of the MIT License.
*/
#include <arch/platform.h>
status_t
arch_platform_init(struct kernel_args *kernelArgs)
{
return B_OK;
}
status_t
arch_platform_init_post_vm(struct kernel_args *kernelArgs)
{
return B_OK;
}
status_t
arch_platform_init_post_thread(struct kernel_args *kernelArgs)
{
return B_OK;
}
@@ -0,0 +1,37 @@
#include <arch/real_time_clock.h>
#include <real_time_clock.h>
#include <real_time_data.h>
status_t
arch_rtc_init(kernel_args *args, struct real_time_data *data)
{
return B_OK;
}
uint32
arch_rtc_get_hw_time(void)
{
return 0;
}
void
arch_rtc_set_hw_time(uint32 seconds)
{
}
void
arch_rtc_set_system_time_offset(struct real_time_data *data, bigtime_t offset)
{
}
bigtime_t
arch_rtc_get_system_time_offset(struct real_time_data *data)
{
return 0;
}
@@ -0,0 +1,58 @@
/*
* Copyright 2007, Haiku Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* François Revol <[email protected]>
*
* Copyright 2004, Axel Dörfler, [email protected]
* Distributed under the terms of the MIT License.
*/
#include <KernelExport.h>
#include <boot/stage2.h>
#include <arch/smp.h>
#include <debug.h>
#include <int.h>
status_t
arch_smp_init(kernel_args *args)
{
return B_OK;
}
status_t
arch_smp_per_cpu_init(kernel_args *args, int32 cpu)
{
return B_OK;
}
void
arch_smp_send_multicast_ici(CPUSet& cpuSet)
{
#if KDEBUG
if (are_interrupts_enabled())
panic("arch_smp_send_multicast_ici: called with interrupts enabled");
#endif
}
void
arch_smp_send_ici(int32 target_cpu)
{
panic("called arch_smp_send_ici!\n");
}
void
arch_smp_send_broadcast_ici()
{
panic("called arch_smp_send_broadcast_ici\n");
}
@@ -0,0 +1,35 @@
/*
* Copyright 2007, Haiku Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* François Revol <[email protected]>
*
* Copyright 2006, Ingo Weinhold <[email protected]>.
* All rights reserved. Distributed under the terms of the MIT License.
*/
#include <OS.h>
#include <arch_cpu.h>
#include <arch/system_info.h>
#include <boot/kernel_args.h>
static uint64 sCPUClockFrequency;
static uint64 sBusClockFrequency;
static uint16 sCPURevision;
void
arch_fill_topology_node(cpu_topology_node_info* node, int32 cpu)
{
}
status_t
arch_system_info_init(struct kernel_args *args)
{
return B_OK;
}
@@ -0,0 +1,132 @@
/* Copyright 2019, Adrien Destugues, [email protected]
* Distributed under the terms of the MIT License.
*/
#include <string.h>
#include <arch_cpu.h>
#include <arch/thread.h>
#include <boot/stage2.h>
#include <kernel.h>
#include <thread.h>
#include <vm/vm_types.h>
status_t
arch_thread_init(struct kernel_args *args)
{
// Initialize the static initial arch_thread state (sInitialState).
// Currently nothing to do, i.e. zero initialized is just fine.
return B_OK;
}
status_t
arch_team_init_team_struct(Team *team, bool kernel)
{
// Nothing to do. The structure is empty.
return B_OK;
}
status_t
arch_thread_init_thread_struct(Thread *thread)
{
// set up an initial state (stack & fpu)
//memcpy(&thread->arch_info, &sInitialState, sizeof(struct arch_thread));
return B_OK;
}
void
arch_thread_init_kthread_stack(Thread* thread, void* _stack, void* _stackTop,
void (*function)(void*), const void* data)
{
#warning RISCV64: Implement thread init kthread
panic("arch_thread_init_kthread_stack(): Implement me!");
}
status_t
arch_thread_init_tls(Thread *thread)
{
// TODO: Implement!
return B_OK;
}
void
arch_thread_context_switch(Thread *from, Thread *to)
{
}
void
arch_thread_dump_info(void *info)
{
}
status_t
arch_thread_enter_userspace(Thread *thread, addr_t entry, void *arg1, void *arg2)
{
panic("arch_thread_enter_uspace(): not yet implemented\n");
return B_ERROR;
}
bool
arch_on_signal_stack(Thread *thread)
{
return false;
}
status_t
arch_setup_signal_frame(Thread *thread, struct sigaction *sa,
struct signal_frame_data *signalFrameData)
{
return B_ERROR;
}
int64
arch_restore_signal_frame(struct signal_frame_data* signalFrameData)
{
return 0;
}
void
arch_check_syscall_restart(Thread *thread)
{
}
/** Saves everything needed to restore the frame in the child fork in the
* arch_fork_arg structure to be passed to arch_restore_fork_frame().
* Also makes sure to return the right value.
*/
void
arch_store_fork_frame(struct arch_fork_arg *arg)
{
}
/** Restores the frame from a forked team as specified by the provided
* arch_fork_arg structure.
* Needs to be called from within the child team, ie. instead of
* arch_thread_enter_uspace() as thread "starter".
* This function does not return to the caller, but will enter userland
* in the child team at the same position where the parent team left of.
*/
void
arch_restore_fork_frame(struct arch_fork_arg *arg)
{
}
@@ -0,0 +1,40 @@
/*
* Copyright 2019, Haiku Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* Adrien Destugues <[email protected]>
*/
#include <kernel.h>
#include <debug.h>
#include <timer.h>
#include <arch/timer.h>
void
arch_timer_set_hardware_timer(bigtime_t timeout)
{
}
void
arch_timer_clear_hardware_timer()
{
}
int
arch_init_timer(kernel_args *args)
{
return B_OK;
}
bigtime_t
system_time(void)
{
// TODO
return 0;
}
@@ -0,0 +1,95 @@
/*
* Copyright 2019, Adrien Destugues, [email protected].
* Distributed under the terms of the MIT License.
*/
#include <debugger.h>
#include <int.h>
#include <thread.h>
#include <arch/user_debugger.h>
void
arch_clear_team_debug_info(struct arch_team_debug_info *info)
{
}
void
arch_destroy_team_debug_info(struct arch_team_debug_info *info)
{
arch_clear_team_debug_info(info);
}
void
arch_clear_thread_debug_info(struct arch_thread_debug_info *info)
{
}
void
arch_destroy_thread_debug_info(struct arch_thread_debug_info *info)
{
arch_clear_thread_debug_info(info);
}
void
arch_update_thread_single_step()
{
}
void
arch_set_debug_cpu_state(const debug_cpu_state *cpuState)
{
}
void
arch_get_debug_cpu_state(debug_cpu_state *cpuState)
{
}
status_t
arch_get_thread_debug_cpu_state(Thread* thread, debug_cpu_state* cpuState)
{
return B_UNSUPPORTED;
}
status_t
arch_set_breakpoint(void *address)
{
return B_ERROR;
}
status_t
arch_clear_breakpoint(void *address)
{
return B_ERROR;
}
status_t
arch_set_watchpoint(void *address, uint32 type, int32 length)
{
return B_ERROR;
}
status_t
arch_clear_watchpoint(void *address)
{
return B_ERROR;
}
bool
arch_has_breakpoints(struct arch_team_debug_info *info)
{
return false;
}
+122
View File
@@ -0,0 +1,122 @@
/*
* Copyright 2001, Travis Geiselbrecht. All rights reserved.
* Copyright 2003-2005, Axel Dörfler, [email protected].
* Copyright 2019, Adrien Destugues, [email protected]
* Distributed under the terms of the MIT License.
*/
#include <vm/vm.h>
#include <vm/VMAddressSpace.h>
#include <arch/vm.h>
//#define TRACE_ARCH_VM
#ifdef TRACE_ARCH_VM
# define TRACE(x) dprintf x
#else
# define TRACE(x) ;
#endif
status_t
arch_vm_init(kernel_args *args)
{
return B_OK;
}
status_t
arch_vm_init_post_area(kernel_args *args)
{
return B_OK;
}
status_t
arch_vm_init_post_modules(kernel_args *args)
{
return B_OK;
}
status_t
arch_vm_init_end(kernel_args *args)
{
TRACE(("arch_vm_init_end(): %lu virtual ranges to keep:\n",
args->arch_args.num_virtual_ranges_to_keep));
for (int i = 0; i < (int)args->arch_args.num_virtual_ranges_to_keep; i++) {
addr_range &range = args->arch_args.virtual_ranges_to_keep[i];
TRACE((" start: %p, size: 0x%lx\n", (void*)range.start, range.size));
#if 0
// skip ranges outside the kernel address space
if (!IS_KERNEL_ADDRESS(range.start)) {
TRACE((" no kernel address, skipping...\n"));
continue;
}
phys_addr_t physicalAddress;
void *address = (void*)range.start;
if (vm_get_page_mapping(VMAddressSpace::KernelID(), range.start,
&physicalAddress) != B_OK)
panic("arch_vm_init_end(): No page mapping for %p\n", address);
area_id area = vm_map_physical_memory(VMAddressSpace::KernelID(),
"boot loader reserved area", &address,
B_EXACT_ADDRESS, range.size,
B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA,
physicalAddress, true);
if (area < 0) {
panic("arch_vm_init_end(): Failed to create area for boot loader "
"reserved area: %p - %p\n", (void*)range.start,
(void*)(range.start + range.size));
}
#endif
}
#if 0
// Throw away any address space mappings we've inherited from the boot
// loader and have not yet turned into an area.
vm_free_unused_boot_loader_range(0, 0xffffffff - B_PAGE_SIZE + 1);
#endif
return B_OK;
}
void
arch_vm_aspace_swap(struct VMAddressSpace *from, struct VMAddressSpace *to)
{
// This functions is only invoked when a userland thread is in the process
// of dying. It switches to the kernel team and does whatever cleanup is
// necessary (in case it is the team's main thread, it will delete the
// team).
// It is however not necessary to change the page directory. Userland team's
// page directories include all kernel mappings as well. Furthermore our
// arch specific translation map data objects are ref-counted, so they won't
// go away as long as they are still used on any CPU.
}
bool
arch_vm_supports_protection(uint32 protection)
{
return true;
}
void
arch_vm_unset_memory_type(VMArea *area)
{
}
status_t
arch_vm_set_memory_type(VMArea *area, addr_t physicalBase, uint32 type)
{
if (type == 0)
return B_OK;
return B_ERROR;
}
@@ -0,0 +1,100 @@
/*
* Copyright 2007-2010, François Revol, [email protected].
* Copyright 2008-2010, Ingo Weinhold, [email protected].
* Copyright 2002-2007, Axel Dörfler, [email protected]. All rights reserved.
* Copyright 2019, Adrien Destugues, [email protected].
* Distributed under the terms of the MIT License.
*
* Copyright 2001, Travis Geiselbrecht. All rights reserved.
* Distributed under the terms of the NewOS License.
*/
#include <KernelExport.h>
#include <kernel.h>
#include <vm/vm.h>
#include <vm/vm_priv.h>
#include <vm/VMAddressSpace.h>
#define TRACE_VM_TMAP
#ifdef TRACE_VM_TMAP
# define TRACE(x...) dprintf(x)
#else
# define TRACE(x...) ;
#endif
status_t
arch_vm_translation_map_init(kernel_args *args,
VMPhysicalPageMapper** _physicalPageMapper)
{
TRACE("vm_translation_map_init: entry\n");
#ifdef TRACE_VM_TMAP
TRACE("physical memory ranges:\n");
for (uint32 i = 0; i < args->num_physical_memory_ranges; i++) {
phys_addr_t start = args->physical_memory_range[i].start;
phys_addr_t end = start + args->physical_memory_range[i].size;
TRACE(" %#10" B_PRIxPHYSADDR " - %#10" B_PRIxPHYSADDR "\n", start,
end);
}
TRACE("allocated physical ranges:\n");
for (uint32 i = 0; i < args->num_physical_allocated_ranges; i++) {
phys_addr_t start = args->physical_allocated_range[i].start;
phys_addr_t end = start + args->physical_allocated_range[i].size;
TRACE(" %#10" B_PRIxPHYSADDR " - %#10" B_PRIxPHYSADDR "\n", start,
end);
}
TRACE("allocated virtual ranges:\n");
for (uint32 i = 0; i < args->num_virtual_allocated_ranges; i++) {
addr_t start = args->virtual_allocated_range[i].start;
addr_t end = start + args->virtual_allocated_range[i].size;
TRACE(" %#10" B_PRIxADDR " - %#10" B_PRIxADDR "\n", start, end);
}
#endif
return B_OK;
}
status_t
arch_vm_translation_map_init_post_sem(kernel_args *args)
{
return B_OK;
}
status_t
arch_vm_translation_map_init_post_area(kernel_args *args)
{
TRACE("vm_translation_map_init_post_area: entry\n");
return B_OK;
}
status_t
arch_vm_translation_map_early_map(kernel_args *args, addr_t va, phys_addr_t pa,
uint8 attributes, phys_addr_t (*get_free_page)(kernel_args *))
{
TRACE("early_tmap: entry pa 0x%lx va 0x%lx\n", pa, va);
return B_OK;
}
status_t
arch_vm_translation_map_create_map(bool kernel, VMTranslationMap** _map)
{
return B_OK;
}
bool
arch_vm_translation_map_is_kernel_page_accessible(addr_t virtualAddress,
uint32 protection)
{
return false;
}
+5 -4
View File
@@ -9,7 +9,7 @@ SEARCH_SOURCE += [ FDirName $(librootSources) os arch $(TARGET_ARCH) ] ;
SEARCH_SOURCE += [ FDirName $(librootSources) os arch generic ] ; SEARCH_SOURCE += [ FDirName $(librootSources) os arch generic ] ;
KernelMergeObject kernel_os_arch_$(TARGET_ARCH).o : KernelMergeObject kernel_os_arch_$(TARGET_ARCH).o :
byteorder.S #byteorder.S
generic_atomic.cpp generic_atomic.cpp
generic_system_time_nsecs.cpp generic_system_time_nsecs.cpp
@@ -22,12 +22,13 @@ SEARCH_SOURCE += [ FDirName $(posixSources) string arch generic ] ;
SEARCH_SOURCE += [ FDirName $(posixSources) string arch $(TARGET_ARCH) ] ; SEARCH_SOURCE += [ FDirName $(posixSources) string arch $(TARGET_ARCH) ] ;
KernelMergeObject kernel_lib_posix_arch_$(TARGET_ARCH).o : KernelMergeObject kernel_lib_posix_arch_$(TARGET_ARCH).o :
siglongjmp.S #siglongjmp.S
sigsetjmp.S #sigsetjmp.S
kernel_longjmp_return.c kernel_longjmp_return.c
kernel_setjmp_save_sigs.c kernel_setjmp_save_sigs.c
arch_string.S #arch_string.S
memcpy.c
memset.c memset.c
: $(TARGET_KERNEL_PIC_CCFLAGS) : $(TARGET_KERNEL_PIC_CCFLAGS)
@@ -0,0 +1,23 @@
SubDir HAIKU_TOP src system libroot os arch riscv64 ;
SubDirC++Flags -std=gnu++11 ;
local architectureObject ;
for architectureObject in [ MultiArchSubDirSetup riscv64 ] {
on $(architectureObject) {
local architecture = $(TARGET_PACKAGING_ARCH) ;
UsePrivateKernelHeaders ;
UsePrivateSystemHeaders ;
SEARCH_SOURCE += [ FDirName $(SUBDIR) $(DOTDOT) generic ] ;
MergeObject <$(architecture)>os_arch_$(TARGET_ARCH).o :
tls.c
thread.c
generic_atomic.cpp
generic_system_time_nsecs.cpp
;
}
}
@@ -0,0 +1,38 @@
/*
* Copyright 2009, Johannes Wischert. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#include <asm_defs.h>
.text
/*
* These aren't needed on gcc4+
* uint16 __swap_int16(uint16 value)
* uint32 __swap_int32(uint32 value)
* uint64 __swap_int64(uint64 value)
*/
/* TODO: The following functions can surely be optimized. A simple optimization
* would be to define macros with the contents of the __swap_int{32,64}
* functions and use those instead of calling the functions.
*/
/* float __swap_float(float value)
*/
FUNCTION(__swap_float):
// Assumes single precision
b __swap_int32
//rts
FUNCTION_END(__swap_float)
/* double __swap_double(double value)
*/
FUNCTION(__swap_double):
// Assumes double is int64 on RV64
b __swap_int64
//rts
FUNCTION_END(__swap_double)
@@ -0,0 +1,9 @@
#include <OS.h>
#include "syscalls.h"
thread_id
find_thread(const char *name)
{
return _kern_find_thread(name);
}
+53
View File
@@ -0,0 +1,53 @@
/*
** Copyright 2003, Axel Dörfler, [email protected]. All rights reserved.
** Distributed under the terms of the MIT License.
*/
// ToDo: this is a dummy implementation - I've not yet gained enough knowledge
// to decide how this should be done, so it's just broken now (okay for single
// threaded apps, though).
// we don't want to have the inline assembly included here
#ifndef _NO_INLINE_ASM
# define _NO_INLINE_ASM 1
#endif
#include "support/TLS.h"
#include "tls.h"
static int32 gNextSlot = TLS_FIRST_FREE_SLOT;
static void *gSlots[TLS_MAX_KEYS];
int32
tls_allocate(void)
{
int32 next = atomic_add(&gNextSlot, 1);
if (next >= TLS_MAX_KEYS)
return B_NO_MEMORY;
return next;
}
void *
tls_get(int32 index)
{
return gSlots[index];
}
void **
tls_address(int32 index)
{
return &gSlots[index];
}
void
tls_set(int32 index, void *value)
{
gSlots[index] = value;
}
@@ -0,0 +1,24 @@
SubDir HAIKU_TOP src system libroot posix arch riscv64 ;
local architectureObject ;
for architectureObject in [ MultiArchSubDirSetup riscv64 ] {
on $(architectureObject) {
local architecture = $(TARGET_PACKAGING_ARCH) ;
local genericSources =
setjmp_save_sigs.c
longjmp_return.c
;
MergeObject <$(architecture)>posix_arch_$(TARGET_ARCH).o :
fenv.c
#sigsetjmp.S
#siglongjmp.S
$(genericSources)
;
SEARCH on [ FGristFiles $(genericSources) ]
= [ FDirName $(SUBDIR) $(DOTDOT) generic ] ;
}
}
@@ -0,0 +1,33 @@
/*-
* Copyright (c) 2004 David Schultz <[email protected]>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD$
*/
#if 0 // disabled for now
#include <posix/fenv.h>
const fenv_t __fe_dfl_env = 0x00000000;
#endif
@@ -0,0 +1,139 @@
SubDir HAIKU_TOP src system libroot posix glibc arch riscv64 ;
SubDirSysHdrs $(HAIKU_TOP) src system libroot posix glibc arch $(TARGET_ARCH) ;
SubDirSysHdrs $(HAIKU_TOP) src system libroot posix glibc include arch
$(TARGET_ARCH) ;
SubDirSysHdrs $(HAIKU_TOP) src system libroot posix glibc include arch generic ;
SubDirSysHdrs $(HAIKU_TOP) src system libroot posix glibc include ;
SubDirSysHdrs $(HAIKU_TOP) src system libroot posix glibc stdlib ;
SubDirSysHdrs $(HAIKU_TOP) src system libroot posix glibc math ;
SubDirSysHdrs $(HAIKU_TOP) src system libroot posix glibc libio ;
SubDirSysHdrs $(HAIKU_TOP) src system libroot posix glibc ;
SubDirHdrs $(HAIKU_TOP) src system libroot posix glibc arch generic ;
UsePrivateHeaders libroot ;
SubDirCcFlags -D_GNU_SOURCE -D_IEEE_LIBM ;
local genericSources =
branred.c
cmp.c dbl2mpn.c divrem.c
dosincos.c
halfulp.c
memrchr.c
mpa.c mpatan.c mpatan2.c mpexp.c mplog.c mpn2dbl.c
mpn2flt.c mpn2ldbl.c mpsqrt.c mptan.c
mul.c mul_n.c
sincos32.c
slowexp.c
slowpow.c
e_acosh.c e_acoshf.c # e_acoshl.c
e_atan2.c e_atan2f.c # e_atan2l.c
e_atanh.c e_atanhf.c # e_atanhl.c
e_cosh.c e_coshf.c # e_coshl.c
e_exp.c e_expf.c
e_fmod.c e_fmodf.c # e_fmodl.c
e_gamma_r.c e_gammaf_r.c
e_hypot.c e_hypotf.c # e_hypotl.c
e_j0.c e_j0f.c
e_j1.c e_j1f.c
e_jn.c e_jnf.c
e_lgamma_r.c e_lgammaf_r.c
e_log.c e_logf.c
e_log10.c e_log10f.c
e_pow.c e_powf.c # e_powl.c
e_rem_pio2f.c
e_remainder.c e_remainderf.c # e_remainderl.c
e_scalb.c e_scalbf.c # e_scalbl.c
e_sinh.c e_sinhf.c # e_sinhl.c
k_cos.c k_cosf.c
k_sin.c k_sinf.c
k_rem_pio2.c k_rem_pio2f.c # k_rem_pio2l.c
k_tan.c k_tanf.c
s_asinh.c s_asinhf.c # s_asinhl.c
s_atan.c s_atanf.c # s_atanl.c
s_cbrt.c s_cbrtf.c # s_cbrtl.c
s_ceil.c s_ceilf.c # s_ceill.c
s_copysign.c s_copysignf.c # s_copysignl.c
s_cos.c s_cosf.c
s_erf.c s_erff.c # s_erfl.c
s_expm1f.c s_expm1.c
s_fabs.c s_fabsf.c # s_fabsl.S
s_finite.c s_finitef.c # s_finitel.c
s_floor.c s_floorf.c # s_floorl.c
s_fma.c s_fmaf.c # s_fmal.c
s_fmax.c s_fmaxf.c # s_fmaxl.c
s_fmin.c s_fminf.c # s_fminl.c
s_fpclassify.c s_fpclassifyf.c # s_fpclassifyl.c
s_frexp.c s_frexpf.c # s_frexpl.c
s_ilogb.c s_ilogbf.c
s_isinf.c s_isinff.c # s_isinfl.c
s_ldexp.c s_ldexpf.c # s_ldexpl.c
s_llrint.c s_llrintf.c # s_llrintl.c
s_log1p.c s_log1pf.c
s_logb.c s_logbf.c # s_logbl.c
s_lrint.c s_lrintf.c # s_lrintl.c
s_lround.c s_lroundf.c
s_modf.c s_modff.c # s_modfl.c
s_nan.c s_nanf.c # s_nanl.c
s_nextafter.c s_nextafterf.c # s_nextafterl.c
s_nexttoward.c # s_nexttowardf.c s_nexttowardl.c
s_round.c s_roundf.c # s_roundl.c
s_scalbn.c s_scalbnf.c # s_scalbnl.c
s_signbit.c s_signbitf.c # s_signbitl.c
s_significand.c s_significandf.c
s_signgam.c
s_sin.c s_sinf.c # s_sinl.c
s_sincos.c s_sincosf.c
s_tan.c s_tanf.c
s_tanh.c s_tanhf.c
s_trunc.c s_truncf.c
t_exp.c
w_acos.c w_acosf.c # w_acosl.c
w_acosh.c w_acoshf.c # w_acoshl.c
w_atan2.c w_atan2f.c # w_atan2l.c
w_asin.c w_asinf.c # w_asinl.c
w_atanh.c w_atanhf.c # w_atanhl.c
w_cosh.c w_coshf.c # w_coshl.c
w_drem.c w_dremf.c # w_dreml.c
w_exp.c w_expf.c # w_expl.c
w_fmod.c w_fmodf.c # w_fmodl.c
w_hypot.c w_hypotf.c # w_hypotl.c
w_j0.c w_j0f.c
w_j1.c w_j1f.c
w_jn.c w_jnf.c
w_lgamma.c w_lgammaf.c
w_lgamma_r.c w_lgammaf_r.c
w_log.c w_logf.c # w_logl.c
w_log10.c w_log10f.c # w_log10l.c
w_pow.c w_powf.c # w_powl.c
w_remainder.c w_remainderf.c # w_remainderl.c
w_scalb.c w_scalbf.c # w_scalbl.c
w_sinh.c w_sinhf.c # w_sinhl.c
# no asm for m68k in glibc
w_sqrt.c w_sqrtf.c # w_sqrtl.c
;
MergeObject <$(TARGET_ARCH)>posix_gnu_arch_$(TARGET_ARCH)_generic.o :
$(genericSources)
;
#MergeObject <$(TARGET_ARCH)>posix_gnu_arch_$(TARGET_ARCH)_other.o :
# ;
MergeObjectFromObjects <$(TARGET_ARCH)>posix_gnu_arch_$(TARGET_ARCH).o
: :
<$(TARGET_ARCH)>posix_gnu_arch_$(TARGET_ARCH)_generic.o
# <$(TARGET_ARCH)>posix_gnu_arch_$(TARGET_ARCH)_other.o
;
SEARCH on [ FGristFiles $(genericSources) ]
= [ FDirName $(HAIKU_TOP) src system libroot posix glibc arch
generic ] ;
@@ -0,0 +1,21 @@
/*
** Copyright 2001, Travis Geiselbrecht. All rights reserved.
** Distributed under the terms of the NewOS License.
*/
#include <asm_defs.h>
#warning RISCV64: optimized assembly memcpy
// for now, a generic C one in:
// * src/system/kernel/lib/arch/riscv64/Jamfile
// * src/system/runtime_loader/arch/riscv64/Jamfile
#if 0
/* that should be enough for now */
.align 4
FUNCTION(memcpy):
/* void *memcpy(void *dest, const void *src, size_t count) */
FUNCTION_END(memcpy)
#endif
@@ -15,7 +15,8 @@ for architectureObject in [ MultiArchSubDirSetup riscv64 ] {
: :
<src!system!libroot!os!arch!$(TARGET_ARCH)!$(architecture)>thread.o <src!system!libroot!os!arch!$(TARGET_ARCH)!$(architecture)>thread.o
<src!system!libroot!posix!string!arch!$(TARGET_ARCH)!$(architecture)>arch_string.o #<src!system!libroot!posix!string!arch!$(TARGET_ARCH)!$(architecture)>arch_string.o
<src!system!libroot!posix!string!arch!$(TARGET_ARCH)!$(architecture)>memcpy.o
<src!system!libroot!posix!string!arch!$(TARGET_ARCH)!$(architecture)>memset.o <src!system!libroot!posix!string!arch!$(TARGET_ARCH)!$(architecture)>memset.o
; ;
} }
@@ -0,0 +1,2 @@
#define SYSCALL_RETURN_TYPE_ALIGNMENT_TYPE long
#define SYSCALL_PARAMETER_ALIGNMENT_TYPE long