aboutsummaryrefslogtreecommitdiff
path: root/pk
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@eecs.berkeley.edu>2014-01-13 16:29:53 -0800
committerAndrew Waterman <waterman@eecs.berkeley.edu>2014-01-13 16:29:53 -0800
commitb71e8ecfda6a75d4bcf240e61dbc3348e76af094 (patch)
tree7e50ac271e16414388e15e8a55e4312a2fbc008e /pk
parent5cd583648dfcb1e36a0054efc910435293d216e3 (diff)
downloadpk-b71e8ecfda6a75d4bcf240e61dbc3348e76af094.zip
pk-b71e8ecfda6a75d4bcf240e61dbc3348e76af094.tar.gz
pk-b71e8ecfda6a75d4bcf240e61dbc3348e76af094.tar.bz2
Assume pc-relative addressing
Diffstat (limited to 'pk')
-rw-r--r--pk/encoding.h48
-rw-r--r--pk/entry.S3
-rw-r--r--pk/pk.S14
-rw-r--r--pk/pk.ld1
4 files changed, 34 insertions, 32 deletions
diff --git a/pk/encoding.h b/pk/encoding.h
index 92accfe..711ef7b 100644
--- a/pk/encoding.h
+++ b/pk/encoding.h
@@ -288,7 +288,7 @@
#define MASK_SRET 0xffffffff
#define MATCH_FNMADD_S 0x4f
#define MASK_FNMADD_S 0x600007f
-#define MATCH_JAL 0x67
+#define MATCH_JAL 0x6f
#define MASK_JAL 0x7f
#define MATCH_LWU 0x6003
#define MASK_LWU 0x707f
@@ -392,7 +392,7 @@
#define MASK_DIVU 0xfe00707f
#define MATCH_AMOSWAP_W 0x800202f
#define MASK_AMOSWAP_W 0xf800707f
-#define MATCH_JALR 0x6f
+#define MATCH_JALR 0x67
#define MASK_JALR 0x707f
#define MATCH_FSD 0x3027
#define MASK_FSD 0x707f
@@ -412,32 +412,32 @@
#define MASK_FMSUB_D 0x600007f
#define MATCH_SD 0x3023
#define MASK_SD 0x707f
-#define CSR_SUP0 0x500
#define CSR_FFLAGS 0x1
#define CSR_FRM 0x2
#define CSR_FCSR 0x3
-#define CSR_CYCLE 0x4
-#define CSR_TIME 0x5
-#define CSR_INSTRET 0x6
+#define CSR_SUP0 0x500
#define CSR_SUP1 0x501
+#define CSR_EPC 0x502
+#define CSR_BADVADDR 0x503
+#define CSR_PTBR 0x504
+#define CSR_ASID 0x505
+#define CSR_COUNT 0x506
+#define CSR_COMPARE 0x507
#define CSR_EVEC 0x508
#define CSR_CAUSE 0x509
#define CSR_STATUS 0x50a
#define CSR_HARTID 0x50b
#define CSR_IMPL 0x50c
-#define CSR_EPC 0x502
+#define CSR_FATC 0x50d
#define CSR_SEND_IPI 0x50e
#define CSR_CLEAR_IPI 0x50f
-#define CSR_BADVADDR 0x503
-#define CSR_PTBR 0x504
#define CSR_STATS 0x51c
#define CSR_RESET 0x51d
#define CSR_TOHOST 0x51e
-#define CSR_ASID 0x505
-#define CSR_COUNT 0x506
-#define CSR_COMPARE 0x507
#define CSR_FROMHOST 0x51f
-#define CSR_FATC 0x50d
+#define CSR_CYCLE 0xc00
+#define CSR_TIME 0xc01
+#define CSR_INSTRET 0xc02
#endif
#ifdef DECLARE_INSN
DECLARE_INSN(fmv_s_x, MATCH_FMV_S_X, MASK_FMV_S_X)
@@ -597,30 +597,30 @@ DECLARE_INSN(fmsub_d, MATCH_FMSUB_D, MASK_FMSUB_D)
DECLARE_INSN(sd, MATCH_SD, MASK_SD)
#endif
#ifdef DECLARE_CSR
-DECLARE_CSR(sup0, CSR_SUP0)
DECLARE_CSR(fflags, CSR_FFLAGS)
DECLARE_CSR(frm, CSR_FRM)
DECLARE_CSR(fcsr, CSR_FCSR)
-DECLARE_CSR(cycle, CSR_CYCLE)
-DECLARE_CSR(time, CSR_TIME)
-DECLARE_CSR(instret, CSR_INSTRET)
+DECLARE_CSR(sup0, CSR_SUP0)
DECLARE_CSR(sup1, CSR_SUP1)
+DECLARE_CSR(epc, CSR_EPC)
+DECLARE_CSR(badvaddr, CSR_BADVADDR)
+DECLARE_CSR(ptbr, CSR_PTBR)
+DECLARE_CSR(asid, CSR_ASID)
+DECLARE_CSR(count, CSR_COUNT)
+DECLARE_CSR(compare, CSR_COMPARE)
DECLARE_CSR(evec, CSR_EVEC)
DECLARE_CSR(cause, CSR_CAUSE)
DECLARE_CSR(status, CSR_STATUS)
DECLARE_CSR(hartid, CSR_HARTID)
DECLARE_CSR(impl, CSR_IMPL)
-DECLARE_CSR(epc, CSR_EPC)
+DECLARE_CSR(fatc, CSR_FATC)
DECLARE_CSR(send_ipi, CSR_SEND_IPI)
DECLARE_CSR(clear_ipi, CSR_CLEAR_IPI)
-DECLARE_CSR(badvaddr, CSR_BADVADDR)
-DECLARE_CSR(ptbr, CSR_PTBR)
DECLARE_CSR(stats, CSR_STATS)
DECLARE_CSR(reset, CSR_RESET)
DECLARE_CSR(tohost, CSR_TOHOST)
-DECLARE_CSR(asid, CSR_ASID)
-DECLARE_CSR(count, CSR_COUNT)
-DECLARE_CSR(compare, CSR_COMPARE)
DECLARE_CSR(fromhost, CSR_FROMHOST)
-DECLARE_CSR(fatc, CSR_FATC)
+DECLARE_CSR(cycle, CSR_CYCLE)
+DECLARE_CSR(time, CSR_TIME)
+DECLARE_CSR(instret, CSR_INSTRET)
#endif
diff --git a/pk/entry.S b/pk/entry.S
index e114fd8..a5f13b8 100644
--- a/pk/entry.S
+++ b/pk/entry.S
@@ -44,7 +44,6 @@
STORE x30,30*REGBYTES(x2)
STORE x31,31*REGBYTES(x2)
-
# get sr, epc, badvaddr, cause
csrr x3,sup0 # x1
csrr x4,sup1 # x2
@@ -59,6 +58,8 @@
STORE x7,34*REGBYTES(x2)
STORE x8,35*REGBYTES(x2)
+ la gp, _gp
+
# get faulting insn, if it wasn't a fetch-related trap
li x5,-1
STORE x5,36*REGBYTES(x2)
diff --git a/pk/pk.S b/pk/pk.S
index 9d6e93d..0273eca 100644
--- a/pk/pk.S
+++ b/pk/pk.S
@@ -8,6 +8,7 @@ _start:
la sp, stack_top
la a0, trap_entry
+ la gp, _gp
csrw evec, a0
li a0, SR_S | SR_PS | SR_EI | SR_S64
@@ -17,12 +18,11 @@ _start:
csrw status, a0
and a2, a1, SR_EF
- lui a0, %hi(have_fp)
- sw a2, %lo(have_fp)(a0)
+ auipc a0, %pcrel_hi(have_fp)
+ sw a2, %lo(have_fp)(a0)
- and a2, a1, SR_EA
- lui a0, %hi(have_accelerator)
- sw a2, %lo(have_accelerator)(a0)
+ and a2, a1, SR_EA
+ auipc a0, %pcrel_hi(have_accelerator)
+ sw a2, %lo(have_accelerator)(a0)
- lui a0, %hi(boot)
- jr a0, %lo(boot)
+ call boot
diff --git a/pk/pk.ld b/pk/pk.ld
index ddd4cc0..1bad03a 100644
--- a/pk/pk.ld
+++ b/pk/pk.ld
@@ -46,6 +46,7 @@ SECTIONS
/* Start of initialized data segment */
. = ALIGN(16);
+ PROVIDE( _gp = . + 0x800 );
_fdata = .;
/* data: Writable data */