#!/bin/sh # 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. set -e cat <<'EOF' // Assembly constants. // AUTOMATICALLY GENERATED BY mkasmh.sh DURING BUILD EOF case "$GOARCH" in 386) # The offsets 0 and 4 are also known to: # nacl/thread.c:/^newosproc # ../../cmd/8l/pass.c:/D_GS # ../../libcgo/linux_386.c:/^threadentry # ../../libcgo/darwin_386.c:/^threadentry case "$GOOS" in windows) echo '#define get_tls(r) MOVL 0x2c(FS), r' echo '#define g(r) 0(r)' echo '#define m(r) 4(r)' ;; linux) # On Linux systems, what we call 0(GS) and 4(GS) for g and m # turn into %gs:-8 and %gs:-4 (using gcc syntax to denote # what the machine sees as opposed to 8l input). # 8l rewrites 0(GS) and 4(GS) into these. # # On Linux Xen, it is not allowed to use %gs:-8 and %gs:-4 # directly. Instead, we have to store %gs:0 into a temporary # register and then use -8(%reg) and -4(%reg). This kind # of addressing is correct even when not running Xen. # # 8l can rewrite MOVL 0(GS), CX into the appropriate pair # of mov instructions, using CX as the intermediate register # (safe because CX is about to be written to anyway). # But 8l cannot handle other instructions, like storing into 0(GS), # which is where these macros come into play. # get_tls sets up the temporary and then g and r use it. # # The final wrinkle is that get_tls needs to read from %gs:0, # but in 8l input it's called 8(GS), because 8l is going to # subtract 8 from all the offsets, as described above. echo '#define get_tls(r) MOVL 8(GS), r' echo '#define g(r) -8(r)' echo '#define m(r) -4(r)' ;; *) echo '#define get_tls(r)' echo '#define g(r) 0(GS)' echo '#define m(r) 4(GS)' ;; esac ;; amd64) # The offsets 0 and 8 are known to: # ../../cmd/6l/pass.c:/D_GS # ../../libcgo/linux_amd64.c:/^threadentry # ../../libcgo/darwin_amd64.c:/^threadentry # echo '#define get_tls(r)' echo '#define g(r) 0(GS)' echo '#define m(r) 8(GS)' ;; arm) echo '#define g R10' echo '#define m R9' echo '#define LR R14' ;; *) echo 'unknown $GOARCH: '$GOARCH 1>&2 exit 1 ;; esac echo awk ' /^aggr G$/ { aggr="g" } /^aggr M$/ { aggr = "m" } /^aggr Gobuf$/ { aggr = "gobuf" } /^}/ { aggr = "" } # Gobuf 24 sched; # 'Y' 48 stack0; # 'Y' 56 entry; # 'A' G 64 alllink; aggr != "" && /^ / { name=$NF; sub(/;/, "", name); offset=$(NF-1); printf("#define %s_%s %s\n", aggr, name, offset); } ' runtime.acid.$GOARCH