mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-21 12:49:33 +02:00
Update packages with information about RiscV.
Fix g_external_wrapper, since it uses a register. Fixed calling of gas. Ported cprt0. git-svn-id: branches/laksen/riscv_new@39475 -
This commit is contained in:
parent
ceb38833f2
commit
6352328f3a
2
.gitattributes
vendored
2
.gitattributes
vendored
@ -10315,6 +10315,7 @@ rtl/qnx/qnx.inc svneol=native#text/plain
|
||||
rtl/qnx/rtldefs.inc svneol=native#text/plain
|
||||
rtl/qnx/signal.inc svneol=native#text/plain
|
||||
rtl/qnx/system.pp svneol=native#text/plain
|
||||
rtl/riscv32/cpuh.inc svneol=native#text/plain
|
||||
rtl/riscv32/int64p.inc svneol=native#text/plain
|
||||
rtl/riscv32/makefile.cpu svneol=native#text/plain
|
||||
rtl/riscv32/math.inc svneol=native#text/plain
|
||||
@ -10324,6 +10325,7 @@ rtl/riscv32/setjump.inc svneol=native#text/plain
|
||||
rtl/riscv32/setjumph.inc svneol=native#text/plain
|
||||
rtl/riscv32/strings.inc svneol=native#text/plain
|
||||
rtl/riscv32/stringss.inc svneol=native#text/plain
|
||||
rtl/riscv64/cpuh.inc svneol=native#text/plain
|
||||
rtl/riscv64/int64p.inc svneol=native#text/plain
|
||||
rtl/riscv64/makefile.cpu svneol=native#text/plain
|
||||
rtl/riscv64/math.inc svneol=native#text/plain
|
||||
|
@ -85,6 +85,12 @@ endif
|
||||
ifeq ($(CPU_TARGET),aarch64)
|
||||
PPSUF=a64
|
||||
endif
|
||||
ifeq ($(CPU_TARGET),riscv32)
|
||||
PPSUF=rv32
|
||||
endif
|
||||
ifeq ($(CPU_TARGET),riscv64)
|
||||
PPSUF=rv64
|
||||
endif
|
||||
|
||||
# cross compilers uses full cpu_target, not just ppc-suffix
|
||||
# (except if the target cannot run a native compiler)
|
||||
|
@ -32,7 +32,7 @@ fpcdir=..
|
||||
unexport FPC_VERSION FPC_COMPILERINFO
|
||||
|
||||
# Which platforms are ready for inclusion in the cycle
|
||||
CYCLETARGETS=i386 powerpc sparc arm x86_64 powerpc64 m68k armeb mipsel mips avr jvm i8086 aarch64 sparc64
|
||||
CYCLETARGETS=i386 powerpc sparc arm x86_64 powerpc64 m68k armeb mipsel mips avr jvm i8086 aarch64 sparc64 riscv32 riscv64
|
||||
|
||||
# All supported targets used for clean
|
||||
ALLTARGETS=$(CYCLETARGETS)
|
||||
@ -83,6 +83,12 @@ endif
|
||||
ifdef AARCH64
|
||||
PPC_TARGET=aarch64
|
||||
endif
|
||||
ifdef RISCV32
|
||||
PPC_TARGET=riscv32
|
||||
endif
|
||||
ifdef RISCV64
|
||||
PPC_TARGET=riscv64
|
||||
endif
|
||||
|
||||
# Default is to generate a compiler for the same
|
||||
# platform as CPU_TARGET (a native compiler)
|
||||
@ -213,6 +219,12 @@ endif
|
||||
ifeq ($(CPC_TARGET),aarch64)
|
||||
CPUSUF=a64
|
||||
endif
|
||||
ifeq ($(CPC_TARGET),riscv32)
|
||||
CPUSUF=rv32
|
||||
endif
|
||||
ifeq ($(CPC_TARGET),riscv64)
|
||||
CPUSUF=rv64
|
||||
endif
|
||||
|
||||
# Do not define the default -d$(CPU_TARGET) because that
|
||||
# will conflict with our -d$(CPC_TARGET)
|
||||
@ -315,6 +327,16 @@ ifeq ($(PPC_TARGET),i8086)
|
||||
override LOCALOPT+=-Fux86
|
||||
endif
|
||||
|
||||
# RiscV32 specific
|
||||
ifeq ($(PPC_TARGET),riscv32)
|
||||
override LOCALOPT+=-Furiscv
|
||||
endif
|
||||
|
||||
# RiscV64 specific
|
||||
ifeq ($(PPC_TARGET),riscv64)
|
||||
override LOCALOPT+=-Furiscv
|
||||
endif
|
||||
|
||||
OPTWPOCOLLECT=-OWdevirtcalls,optvmts -FW$(BASEDIR)/pp1.wpo
|
||||
OPTWPOPERFORM=-Owdevirtcalls,optvmts -Fw$(BASEDIR)/pp1.wpo
|
||||
# symbol liveness WPO requires nm, smart linking and no stripping (the latter
|
||||
@ -432,7 +454,7 @@ endif
|
||||
# CPU targets
|
||||
#####################################################################
|
||||
|
||||
PPC_TARGETS=i386 m68k powerpc sparc arm armeb x86_64 powerpc64 mips mipsel avr jvm i8086 aarch64 sparc64
|
||||
PPC_TARGETS=i386 m68k powerpc sparc arm armeb x86_64 powerpc64 mips mipsel avr jvm i8086 aarch64 sparc64 riscv32 riscv64
|
||||
INSTALL_TARGETS=$(addsuffix _exe_install,$(sort $(CYCLETARGETS) $(PPC_TARGETS)))
|
||||
SYMLINKINSTALL_TARGETS=$(addsuffix _symlink_install,$(sort $(CYCLETARGETS) $(PPC_TARGETS)))
|
||||
|
||||
@ -802,7 +824,7 @@ ifeq ($(OS_SOURCE),win64)
|
||||
EXCLUDE_80BIT_TARGETS=1
|
||||
endif
|
||||
|
||||
ifneq ($(findstring $(CPU_SOURCE),aarch64 arm avr jvm m68k mips mipsel powerpc powerpc64 sparc sparc64),)
|
||||
ifneq ($(findstring $(CPU_SOURCE),aarch64 arm avr jvm m68k mips mipsel powerpc powerpc64 sparc sparc64 riscv32 riscv64),)
|
||||
EXCLUDE_80BIT_TARGETS=1
|
||||
endif
|
||||
|
||||
|
@ -212,11 +212,7 @@ unit agrvgas;
|
||||
function TRVGNUAssembler.MakeCmdLine: TCmdStr;
|
||||
begin
|
||||
result := inherited MakeCmdLine;
|
||||
{$ifdef cpu64bitaddr}
|
||||
Replace(result,'$ARCH','-m64')
|
||||
{$else cpu64bitaddr}
|
||||
Replace(result,'$ARCH','-m32');
|
||||
{$endif cpu64bitaddr}
|
||||
Replace(result,'$ARCH',lower(cputypestr[current_settings.cputype]));
|
||||
end;
|
||||
|
||||
|
||||
@ -227,7 +223,7 @@ unit agrvgas;
|
||||
|
||||
idtxt : 'AS';
|
||||
asmbin : 'as';
|
||||
asmcmd : '-o $OBJ $EXTRAOPT $ARCH $ASM';
|
||||
asmcmd : '-o $OBJ $EXTRAOPT -march=$ARCH $ASM';
|
||||
supported_targets : [system_riscv32_linux,system_riscv64_linux];
|
||||
flags : [af_needar,af_smartlink_sections];
|
||||
labelprefix : '.L';
|
||||
|
@ -34,11 +34,15 @@ uses
|
||||
cgbase,cgutils,hlcgobj,hlcg2ll, parabase;
|
||||
|
||||
type
|
||||
|
||||
{ thlcgriscv }
|
||||
|
||||
thlcgriscv = class(thlcg2ll)
|
||||
protected
|
||||
procedure a_load_subsetref_regs_noindex(list: TAsmList; subsetsize: tdef; loadbitsize: byte; const sref: tsubsetreference; valuereg, extra_value_reg: tregister); override;
|
||||
public
|
||||
procedure g_intf_wrapper(list: TAsmList; procdef: tprocdef; const labelname: string; ioffset: longint);override;
|
||||
procedure g_external_wrapper(list: TAsmList; procdef: tprocdef; const wrappername, externalname: string; global: boolean); override;
|
||||
end;
|
||||
|
||||
implementation
|
||||
@ -213,5 +217,44 @@ implementation
|
||||
list.concat(Tai_symbol_end.Createname(labelname));
|
||||
end;
|
||||
|
||||
procedure thlcgriscv.g_external_wrapper(list: TAsmList; procdef: tprocdef; const wrappername, externalname: string; global: boolean);
|
||||
var
|
||||
sym: tasmsymbol;
|
||||
ai: taicpu;
|
||||
href: treference;
|
||||
tmpreg: TRegister;
|
||||
l: TAsmLabel;
|
||||
begin
|
||||
maybe_new_object_file(list);
|
||||
new_section(list,sec_code,wrappername,target_info.alignment.procalign);
|
||||
if global then
|
||||
begin
|
||||
sym:=current_asmdata.DefineAsmSymbol(wrappername,AB_GLOBAL,AT_FUNCTION,procdef);
|
||||
list.concat(Tai_symbol.Create_global(sym,0));
|
||||
end
|
||||
else
|
||||
begin
|
||||
sym:=current_asmdata.DefineAsmSymbol(wrappername,AB_LOCAL,AT_FUNCTION,procdef);
|
||||
list.concat(Tai_symbol.Create(sym,0));
|
||||
end;
|
||||
|
||||
reference_reset_symbol(href,current_asmdata.RefAsmSymbol(externalname,AT_FUNCTION),0,0,[]);
|
||||
|
||||
tmpreg:=NR_X5;
|
||||
|
||||
current_asmdata.getjumplabel(l);
|
||||
a_label(list,l);
|
||||
|
||||
href.refaddr:=addr_pcrel_hi20;
|
||||
list.concat(taicpu.op_reg_ref(A_AUIPC,tmpreg,href));
|
||||
reference_reset_symbol(href,l,0,0,[]);
|
||||
href.refaddr:=addr_pcrel_lo12;
|
||||
ai:=taicpu.op_reg_reg_ref(A_JALR,NR_X0,tmpreg,href);
|
||||
ai.is_jmp:=true;
|
||||
list.concat(ai);
|
||||
|
||||
list.concat(Tai_symbol_end.Create(sym));
|
||||
end;
|
||||
|
||||
end.
|
||||
|
||||
|
@ -31,6 +31,9 @@ unit cpunode;
|
||||
{ generic nodes }
|
||||
ncgbas,ncgld,ncgflw,ncgcnv,ncgmem,ncgcon,ncgcal,ncgset,ncginl,ncgopt,
|
||||
ncgobjc,
|
||||
{ symtable }
|
||||
symcpu,
|
||||
aasmdef,
|
||||
{ to be able to only parts of the generic code,
|
||||
the processor specific nodes must be included
|
||||
after the generic one (FK)
|
||||
|
@ -32,7 +32,8 @@ uses
|
||||
ncgbas, ncgld, ncgflw, ncgcnv, ncgmem, ncgcon, ncgcal, ncgset, ncginl, ncgopt,
|
||||
ncgobjc,
|
||||
{ symtable }
|
||||
symcpu,
|
||||
symcpu,
|
||||
aasmdef,
|
||||
{ to be able to only parts of the generic code,
|
||||
the processor specific nodes must be included
|
||||
after the generic one (FK)
|
||||
|
@ -110,7 +110,7 @@ Type
|
||||
// Please keep this order, see OSCPUSupported below
|
||||
TCpu=(cpuNone,
|
||||
i386,m68k,powerpc,sparc,x86_64,arm,powerpc64,avr,armeb,
|
||||
mips,mipsel,jvm,i8086,aarch64,sparc64
|
||||
mips,mipsel,jvm,i8086,aarch64,sparc64,riscv32,riscv64
|
||||
);
|
||||
TCPUS = Set of TCPU;
|
||||
|
||||
@ -185,46 +185,46 @@ Const
|
||||
|
||||
{ This table is kept OS,Cpu because it is easier to maintain (PFV) }
|
||||
OSCPUSupported : array[TOS,TCpu] of boolean = (
|
||||
{ os none i386 m68k ppc sparc x86_64 arm ppc64 avr armeb mips mipsel jvm i8086 aarch64 sparc64}
|
||||
{ none } ( false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ linux } ( false, true, true, true, true, true, true, true, false, true , true , true , false, false, true , true ),
|
||||
{ go32v2 } ( false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ win32 } ( false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ os2 } ( false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ freebsd } ( false, true, true, false, false, true, false, false, false, false, false, false, false, false, false, false),
|
||||
{ beos } ( false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ netbsd } ( false, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false),
|
||||
{ amiga } ( false, false, true, true, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ atari } ( false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ solaris } ( false, true, false, false, true, true, false, false, false, false, false, false, false, false, false, false),
|
||||
{ qnx } ( false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ netware } ( false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ openbsd } ( false, true, true, false, false, true, false, false, false, false, false, false, false, false, false, false),
|
||||
{ wdosx } ( false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ palmos } ( false, false, true, false, false, false, true, false, false, false, false, false, false, false, false, false),
|
||||
{ macos } ( false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ darwin } ( false, true, false, true, false, true, true, true, false, false, false, false, false, false, true , false),
|
||||
{ emx } ( false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ watcom } ( false, true, false, false, false ,false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ morphos } ( false, false, false, true, false ,false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ netwlibc }( false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ win64 } ( false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false),
|
||||
{ wince }( false, true, false, false, false, false, true, false, false, false, false, false, false, false, false, false),
|
||||
{ gba } ( false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false),
|
||||
{ nds } ( false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false),
|
||||
{ embedded }( false, true, true, true, true, true, true, true, true, true , false, false, false, true , false, false),
|
||||
{ symbian } ( false, true, false, false, false, false, true, false, false, false, false, false, false, false, false, false),
|
||||
{ haiku } ( false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ iphonesim}( false, true, false, false, false, true, false, false, false, false, false, false, false, false, false, false),
|
||||
{ aix } ( false, false, false, true, false, false, false, true, false, false, false, false, false, false, false, false),
|
||||
{ java } ( false, false, false, false, false, false, false, false, false, false, false, false, true , false, false, false),
|
||||
{ android } ( false, true, false, false, false, false, true, false, false, false, false, true, true , false, false, false),
|
||||
{ nativent }( false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ msdos } ( false, false, false, false, false, false, false, false, false, false, false, false, false, true , false, false),
|
||||
{ wii } ( false, false, false, true , false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ aros } ( true, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false),
|
||||
{ dragonfly}( false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false),
|
||||
{ win16 } ( false, false, false, false, false, false, false, false, false, false, false, false, false, true , false, false)
|
||||
{ os none i386 m68k ppc sparc x86_64 arm ppc64 avr armeb mips mipsel jvm i8086 aarch64 sparc64 riscv32 riscv64}
|
||||
{ none } ( false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ linux } ( false, true, true, true, true, true, true, true, false, true , true , true , false, false, true , true , true , true ),
|
||||
{ go32v2 } ( false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ win32 } ( false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ os2 } ( false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ freebsd } ( false, true, true, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ beos } ( false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ netbsd } ( false, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ amiga } ( false, false, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ atari } ( false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ solaris } ( false, true, false, false, true, true, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ qnx } ( false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ netware } ( false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ openbsd } ( false, true, true, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ wdosx } ( false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ palmos } ( false, false, true, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ macos } ( false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ darwin } ( false, true, false, true, false, true, true, true, false, false, false, false, false, false, true , false, false, false),
|
||||
{ emx } ( false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ watcom } ( false, true, false, false, false ,false, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ morphos } ( false, false, false, true, false ,false, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ netwlibc }( false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ win64 } ( false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ wince }( false, true, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ gba } ( false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ nds } ( false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ embedded }( false, true, true, true, true, true, true, true, true, true , false, false, false, true , false, false, true , true ),
|
||||
{ symbian } ( false, true, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ haiku } ( false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ iphonesim}( false, true, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ aix } ( false, false, false, true, false, false, false, true, false, false, false, false, false, false, false, false, false, false),
|
||||
{ java } ( false, false, false, false, false, false, false, false, false, false, false, false, true , false, false, false, false, false),
|
||||
{ android } ( false, true, false, false, false, false, true, false, false, false, false, true, true , false, false, false, false, false),
|
||||
{ nativent }( false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ msdos } ( false, false, false, false, false, false, false, false, false, false, false, false, false, true , false, false, false, false),
|
||||
{ wii } ( false, false, false, true , false, false, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ aros } ( true, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ dragonfly}( false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false),
|
||||
{ win16 } ( false, false, false, false, false, false, false, false, false, false, false, false, false, true , false, false, false, false)
|
||||
);
|
||||
|
||||
// Useful
|
||||
@ -2784,6 +2784,8 @@ begin
|
||||
powerpc: result := GetGccDirArch('cpupowerpc','-m32');
|
||||
powerpc64:result := GetGccDirArch('cpupowerpc64','-m64');
|
||||
aarch64: result := GetGccDirArch('cpuaarch64','');
|
||||
riscv32: result := GetGccDirArch('cpuriscv64','-march=rv32imafdc');
|
||||
riscv64: result := GetGccDirArch('cpuriscv64','-march=rv64imafdc');
|
||||
end {case}
|
||||
else if OS = darwin then
|
||||
case CPU of
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -90,6 +90,10 @@ override LOADERS=
|
||||
SYSINIT_UNITS=si_prc si_c si_g si_dll
|
||||
endif
|
||||
|
||||
ifeq ($(ARCH),riscv64)
|
||||
override LOADERS=prt0 cprt0
|
||||
endif
|
||||
|
||||
# mipsel reuses mips files by including so some file names exist
|
||||
# twice, this causes the compiler to find sometimes wrong files and it tries
|
||||
# to recompile rtl units. To prevent this, compile always as release PPUs, this
|
||||
@ -196,6 +200,13 @@ ifeq ($(ARCH),sparc64)
|
||||
ASSHAREDOPT=-KPIC
|
||||
endif
|
||||
|
||||
ifeq ($(ARCH),riscv32)
|
||||
ASTARGET=-march=rv32imafdc
|
||||
endif
|
||||
ifeq ($(ARCH),riscv64)
|
||||
ASTARGET=-march=rv64imafdc
|
||||
endif
|
||||
|
||||
ifeq ($(ARCH),arm)
|
||||
ifeq ($(SUBARCH),armv6m)
|
||||
ASTARGET+=-mthumb --def __thumb__=1
|
||||
|
@ -296,7 +296,7 @@ CONST
|
||||
clone_flags_fork = $01200011;
|
||||
{ SIGCHLD | CLONE_CHILD_CLEARTID | CLONE_CHILD_SETTID }
|
||||
|
||||
{$if defined(cpuarm) or defined(cpualpha) or defined(cpublackfin) or defined(cpum68k) or defined(aarch64)}
|
||||
{$if defined(cpuarm) or defined(cpualpha) or defined(cpublackfin) or defined(cpum68k) or defined(aarch64) or defined(riscv32) or defined(riscv64)}
|
||||
O_LARGEFILE = $20000;
|
||||
{$endif}
|
||||
{$if defined(cpusparc) or defined(cpusparc64)}
|
||||
|
@ -45,63 +45,79 @@
|
||||
.globl _start
|
||||
.type _start,function
|
||||
_start:
|
||||
.option push
|
||||
.option norelax
|
||||
1:auipc gp, %pcrel_hi(__global_pointer$)
|
||||
addi gp, gp, %pcrel_lo(1b)
|
||||
.option pop
|
||||
|
||||
/* Clear the frame pointer since this is the outermost frame. */
|
||||
mov fp, #0
|
||||
ldmia sp!, {a2}
|
||||
addi fp, x0, 0
|
||||
ld a2, 0(sp)
|
||||
addi sp, sp, 8
|
||||
|
||||
/* Pop argc off the stack and save a pointer to argv */
|
||||
ldr ip,=operatingsystem_parameter_argc
|
||||
ldr a3,=operatingsystem_parameter_argv
|
||||
str a2,[ip]
|
||||
1:auipc x8,%pcrel_hi(operatingsystem_parameter_argc)
|
||||
sd a2,%pcrel_lo(1b)(x8)
|
||||
1:auipc x8,%pcrel_hi(operatingsystem_parameter_argv)
|
||||
sd sp,%pcrel_lo(1b)(x8)
|
||||
|
||||
/* calc envp */
|
||||
add a4,a2,#1
|
||||
add a4,sp,a4,LSL #2
|
||||
ldr ip,=operatingsystem_parameter_envp
|
||||
addi a4, a2, 1
|
||||
slli a4, a4, 3
|
||||
add a4, sp, a4
|
||||
|
||||
str sp,[a3]
|
||||
str a4,[ip]
|
||||
1:auipc x8,%pcrel_hi(operatingsystem_parameter_envp)
|
||||
sd a4,%pcrel_lo(1b)(x8)
|
||||
|
||||
/* Save initial stackpointer */
|
||||
ldr ip,=__stkptr
|
||||
str sp,[ip]
|
||||
1:auipc x8,%pcrel_hi(__stkptr)
|
||||
sd sp,%pcrel_lo(1b)(x8)
|
||||
|
||||
/* Fetch address of fini */
|
||||
ldr ip, =_fini
|
||||
1:auipc x8,%pcrel_hi(_fini)
|
||||
addi a2,x8,%pcrel_lo(1b)
|
||||
|
||||
/* argc already loaded to a2*/
|
||||
|
||||
/* load argv */
|
||||
mov a3, sp
|
||||
addi a3, sp, 0
|
||||
|
||||
/* Push stack limit */
|
||||
str a3, [sp, #-4]!
|
||||
sd a3, -8(sp)
|
||||
addi sp, sp, -8
|
||||
|
||||
/* Push rtld_fini */
|
||||
str a1, [sp, #-4]!
|
||||
sd a1, -8(sp)
|
||||
addi sp, sp, -8
|
||||
|
||||
/* Set up the other arguments in registers */
|
||||
ldr a1, =PASCALMAIN
|
||||
ldr a4, =_init
|
||||
1:auipc x8,%pcrel_hi(PASCALMAIN)
|
||||
addi a1, x8, %pcrel_lo(1b)
|
||||
1:auipc x8,%pcrel_hi(_init)
|
||||
addi a4, x8, %pcrel_lo(1b)
|
||||
|
||||
/* Push fini */
|
||||
str ip, [sp, #-4]!
|
||||
sd a2, -8(sp)
|
||||
addi sp, sp, -8
|
||||
|
||||
/* __libc_start_main (main, argc, argv, init, fini, rtld_fini, stack_end) */
|
||||
|
||||
/* Let the libc call main and exit with its return code. */
|
||||
bl __libc_start_main
|
||||
1:auipc x8,%pcrel_hi(__libc_start_main)
|
||||
jalr ra, x8, %pcrel_lo(1b)
|
||||
|
||||
/* should never get here....*/
|
||||
bl abort
|
||||
1:auipc x8,%pcrel_hi(abort)
|
||||
jalr ra, x8, %pcrel_lo(1b)
|
||||
|
||||
.globl _haltproc
|
||||
.type _haltproc,function
|
||||
_haltproc:
|
||||
ldr r0,=operatingsystem_result
|
||||
ldrb r0,[r0]
|
||||
swi 0x900001
|
||||
b _haltproc
|
||||
1:auipc x8,%pcrel_hi(operatingsystem_result)
|
||||
lbu x1,%pcrel_lo(1b)(x8)
|
||||
addi x17, x0, 94
|
||||
ecall
|
||||
jal x0, _haltproc
|
||||
|
||||
/* Define a symbol for the first piece of initialized data. */
|
||||
.data
|
||||
|
@ -20,14 +20,14 @@ _dynamic_start:
|
||||
.type _start, function
|
||||
_start:
|
||||
1:
|
||||
auipc gp, %pcrel_hi(__bss_start+0x800)
|
||||
addi gp, gp, %pcrel_lo(1b)
|
||||
auipc gp, %pcrel_hi(__bss_start+0x800)
|
||||
addi gp, gp, %pcrel_lo(1b)
|
||||
|
||||
/* Get argc, argv, envp */
|
||||
ld x5,(x2)
|
||||
addi x6,x2,8
|
||||
addi x7,x5,1
|
||||
slli x7,x7,3
|
||||
slli x7,x7,3
|
||||
add x7,x6,x7
|
||||
|
||||
/* Save argc, argv, envp, and initial stack pointer */
|
||||
|
15
rtl/riscv32/cpuh.inc
Normal file
15
rtl/riscv32/cpuh.inc
Normal file
@ -0,0 +1,15 @@
|
||||
{
|
||||
|
||||
This file is part of the Free Pascal run time library.
|
||||
Copyright (c) 2016 by the Free Pascal development team.
|
||||
|
||||
CPU specific system unit header file
|
||||
|
||||
See the file COPYING.FPC, included in this distribution,
|
||||
for details about the copyright.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
**********************************************************************}
|
15
rtl/riscv64/cpuh.inc
Normal file
15
rtl/riscv64/cpuh.inc
Normal file
@ -0,0 +1,15 @@
|
||||
{
|
||||
|
||||
This file is part of the Free Pascal run time library.
|
||||
Copyright (c) 2016 by the Free Pascal development team.
|
||||
|
||||
CPU specific system unit header file
|
||||
|
||||
See the file COPYING.FPC, included in this distribution,
|
||||
for details about the copyright.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
**********************************************************************}
|
@ -1 +1 @@
|
||||
'2018-04-29 rev 38866'
|
||||
'2018-07-20 rev 39474'
|
||||
|
Loading…
Reference in New Issue
Block a user