mirror of
https://github.com/golang/go
synced 2024-11-18 15:04:44 -07:00
Added enough arm related scaffolding to create a simple
hello.c program linking against the runtime. R=rsc APPROVED=rsc DELTA=178 (175 added, 0 deleted, 3 changed) OCL=29283 CL=29380
This commit is contained in:
parent
802e1a6104
commit
7943556970
@ -34,7 +34,8 @@
|
|||||||
|
|
||||||
#define NOPROF (1<<0)
|
#define NOPROF (1<<0)
|
||||||
#define DUPOK (1<<1)
|
#define DUPOK (1<<1)
|
||||||
#define ALLTHUMBS (1<<2)
|
#define NOSPLIT (1<<2)
|
||||||
|
#define ALLTHUMBS (1<<3)
|
||||||
|
|
||||||
#define REGRET 0
|
#define REGRET 0
|
||||||
#define REGARG 0
|
#define REGARG 0
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
# Set SIZE to 32 or 64.
|
# Set SIZE to 32 or 64.
|
||||||
SIZE_386=32
|
SIZE_386=32
|
||||||
SIZE_amd64=64
|
SIZE_amd64=64
|
||||||
|
SIZE_arm=32
|
||||||
SIZE=$(SIZE_$(GOARCH))
|
SIZE=$(SIZE_$(GOARCH))
|
||||||
|
|
||||||
# Setup CFLAGS. Add -D_64BIT on 64-bit platforms (sorry).
|
# Setup CFLAGS. Add -D_64BIT on 64-bit platforms (sorry).
|
||||||
@ -14,6 +15,7 @@ CFLAGS=-I$(GOOS) -I$(GOOS)/$(GOARCH) -wF $(CFLAGS_$(SIZE))
|
|||||||
# Set O to right letter.
|
# Set O to right letter.
|
||||||
O_386=8
|
O_386=8
|
||||||
O_amd64=6
|
O_amd64=6
|
||||||
|
O_arm=5
|
||||||
O=$(O_$(GOARCH))
|
O=$(O_$(GOARCH))
|
||||||
|
|
||||||
# Tools
|
# Tools
|
||||||
@ -79,10 +81,10 @@ $(LIB): $(OFILES)
|
|||||||
$(OFILES): $(HFILES)
|
$(OFILES): $(HFILES)
|
||||||
|
|
||||||
nuke:
|
nuke:
|
||||||
rm -f *.[68] *.a $(GOROOT)/lib/$(LIB)
|
rm -f *.[568] *.a $(GOROOT)/lib/$(LIB)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f *.[68] *.a runtime.acid cgo2c
|
rm -f *.[568] *.a runtime.acid cgo2c
|
||||||
|
|
||||||
%.$O: %.c
|
%.$O: %.c
|
||||||
$(CC) $(CFLAGS) $<
|
$(CC) $(CFLAGS) $<
|
||||||
|
83
src/runtime/arm/asm.s
Normal file
83
src/runtime/arm/asm.s
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
// Copyright 2009 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
TEXT _rt0_arm(SB),7,$0
|
||||||
|
// copy arguments forward on an even stack
|
||||||
|
// MOVW $0(SP), R0
|
||||||
|
// MOVL 0(SP), R1 // argc
|
||||||
|
// LEAL 4(SP), R1 // argv
|
||||||
|
// SUBL $128, SP // plenty of scratch
|
||||||
|
// ANDL $~7, SP
|
||||||
|
// MOVL AX, 120(SP) // save argc, argv away
|
||||||
|
// MOVL BX, 124(SP)
|
||||||
|
|
||||||
|
|
||||||
|
// // write "go386\n"
|
||||||
|
// PUSHL $6
|
||||||
|
// PUSHL $hello(SB)
|
||||||
|
// PUSHL $1
|
||||||
|
// CALL sys·write(SB)
|
||||||
|
// POPL AX
|
||||||
|
// POPL AX
|
||||||
|
// POPL AX
|
||||||
|
|
||||||
|
|
||||||
|
// CALL ldt0setup(SB)
|
||||||
|
|
||||||
|
// set up %fs to refer to that ldt entry
|
||||||
|
// MOVL $(7*8+7), AX
|
||||||
|
// MOVW AX, FS
|
||||||
|
|
||||||
|
// // store through it, to make sure it works
|
||||||
|
// MOVL $0x123, 0(FS)
|
||||||
|
// MOVL tls0(SB), AX
|
||||||
|
// CMPL AX, $0x123
|
||||||
|
// JEQ ok
|
||||||
|
// MOVL AX, 0
|
||||||
|
// ok:
|
||||||
|
|
||||||
|
// // set up m and g "registers"
|
||||||
|
// // g is 0(FS), m is 4(FS)
|
||||||
|
// LEAL g0(SB), CX
|
||||||
|
// MOVL CX, 0(FS)
|
||||||
|
// LEAL m0(SB), AX
|
||||||
|
// MOVL AX, 4(FS)
|
||||||
|
|
||||||
|
// // save m->g0 = g0
|
||||||
|
// MOVL CX, 0(AX)
|
||||||
|
|
||||||
|
// // create istack out of the OS stack
|
||||||
|
// LEAL (-8192+104)(SP), AX // TODO: 104?
|
||||||
|
// MOVL AX, 0(CX) // 8(g) is stack limit (w 104b guard)
|
||||||
|
// MOVL SP, 4(CX) // 12(g) is base
|
||||||
|
// CALL emptyfunc(SB) // fault if stack check is wrong
|
||||||
|
|
||||||
|
// // convention is D is always cleared
|
||||||
|
// CLD
|
||||||
|
|
||||||
|
// CALL check(SB)
|
||||||
|
|
||||||
|
// // saved argc, argv
|
||||||
|
// MOVL 120(SP), AX
|
||||||
|
// MOVL AX, 0(SP)
|
||||||
|
// MOVL 124(SP), AX
|
||||||
|
// MOVL AX, 4(SP)
|
||||||
|
// CALL args(SB)
|
||||||
|
// CALL osinit(SB)
|
||||||
|
// CALL schedinit(SB)
|
||||||
|
|
||||||
|
// // create a new goroutine to start program
|
||||||
|
// PUSHL $mainstart(SB) // entry
|
||||||
|
// PUSHL $8 // arg size
|
||||||
|
// CALL sys·newproc(SB)
|
||||||
|
// POPL AX
|
||||||
|
// POPL AX
|
||||||
|
|
||||||
|
// // start this M
|
||||||
|
// CALL mstart(SB)
|
||||||
|
|
||||||
|
BL main<EFBFBD>main(SB)
|
||||||
|
MOVW $99, R0
|
||||||
|
SWI $0x00900001
|
||||||
|
|
4
src/runtime/arm/closure.c
Normal file
4
src/runtime/arm/closure.c
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
// Copyright 2009 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
0
src/runtime/arm/traceback.s
Normal file
0
src/runtime/arm/traceback.s
Normal file
27
src/runtime/linux/arm/defs.h
Normal file
27
src/runtime/linux/arm/defs.h
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
// godefs -carm-gcc -f -I/usr/local/google/src/linux-2.6.28/arch/arm/include -f -I/usr/local/google/src/linux-2.6.28/include defs_arm.c
|
||||||
|
|
||||||
|
// MACHINE GENERATED - DO NOT EDIT.
|
||||||
|
|
||||||
|
// Constants
|
||||||
|
enum {
|
||||||
|
PROT_NONE = 0,
|
||||||
|
PROT_READ = 0x1,
|
||||||
|
PROT_WRITE = 0x2,
|
||||||
|
PROT_EXEC = 0x4,
|
||||||
|
MAP_ANON = 0x20,
|
||||||
|
MAP_PRIVATE = 0x2,
|
||||||
|
SA_RESTART = 0x10000000,
|
||||||
|
SA_ONSTACK = 0x8000000,
|
||||||
|
SA_RESTORER = 0x4000000,
|
||||||
|
SA_SIGINFO = 0x4,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Types
|
||||||
|
#pragma pack on
|
||||||
|
|
||||||
|
typedef struct Timespec Timespec;
|
||||||
|
struct Timespec {
|
||||||
|
int32 tv_sec;
|
||||||
|
int32 tv_nsec;
|
||||||
|
};
|
||||||
|
#pragma pack off
|
6
src/runtime/linux/arm/rt0.s
Normal file
6
src/runtime/linux/arm/rt0.s
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
// Copyright 2009 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
TEXT _rt0_arm_linux(SB),7,$0
|
||||||
|
B _rt0_arm(SB)
|
4
src/runtime/linux/arm/signal.c
Normal file
4
src/runtime/linux/arm/signal.c
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
// Copyright 2009 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
15
src/runtime/linux/arm/sys.s
Normal file
15
src/runtime/linux/arm/sys.s
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// Copyright 2009 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
//
|
||||||
|
// System calls and other sys.stuff for arm, Linux
|
||||||
|
//
|
||||||
|
|
||||||
|
TEXT write(SB),7,$0
|
||||||
|
MOVW 4(SP), R0
|
||||||
|
MOVW 8(SP), R1
|
||||||
|
MOVW 12(SP), R2
|
||||||
|
SWI $0x00900004 // syscall write
|
||||||
|
RET
|
||||||
|
|
54
src/runtime/linux/defs_arm.c
Normal file
54
src/runtime/linux/defs_arm.c
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
// Copyright 2009 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Input to godefs
|
||||||
|
godefs -carm-gcc -f -I/usr/local/google/src/linux-2.6.28/arch/arm/include -f
|
||||||
|
-I/usr/local/google/src/linux-2.6.28/include defs_arm.c >arm/defs.h
|
||||||
|
|
||||||
|
* Another input file for ARM defs.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <asm/signal.h>
|
||||||
|
#include <asm/mman.h>
|
||||||
|
#include <asm/sigcontext.h>
|
||||||
|
#include <asm/ucontext.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
#include <sys/signal.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <ucontext.h>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
enum {
|
||||||
|
$PROT_NONE = PROT_NONE,
|
||||||
|
$PROT_READ = PROT_READ,
|
||||||
|
$PROT_WRITE = PROT_WRITE,
|
||||||
|
$PROT_EXEC = PROT_EXEC,
|
||||||
|
|
||||||
|
$MAP_ANON = MAP_ANONYMOUS,
|
||||||
|
$MAP_PRIVATE = MAP_PRIVATE,
|
||||||
|
|
||||||
|
$SA_RESTART = SA_RESTART,
|
||||||
|
$SA_ONSTACK = SA_ONSTACK,
|
||||||
|
$SA_RESTORER = SA_RESTORER,
|
||||||
|
$SA_SIGINFO = SA_SIGINFO
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//typedef struct _fpreg $Fpreg;
|
||||||
|
//typedef struct _fpxreg $Fpxreg;
|
||||||
|
//typedef struct _xmmreg $Xmmreg;
|
||||||
|
//typedef struct _fpstate $Fpstate;
|
||||||
|
typedef struct timespec $Timespec;
|
||||||
|
//typedef struct timeval $Timeval;
|
||||||
|
// typedef struct sigaction $Sigaction;
|
||||||
|
// typedef siginfo_t $Siginfo;
|
||||||
|
// typedef struct sigaltstack $Sigaltstack;
|
||||||
|
// typedef struct sigcontext $Sigcontext;
|
||||||
|
// typedef struct ucontext $Ucontext;
|
Loading…
Reference in New Issue
Block a user