commit fabb83cbf04e6df6aada443d412188a5f3a25f22
parent 263c76dd4e6d88a782da01346f9e5b146d08b2e8
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date: Fri, 18 Dec 2020 17:48:26 +0100
os9: Add newstack()
This function creates a new stack for the current process.
Change-Id: Id06cced0e8a4eb8cf3e027a8d3c600120b33121c
Diffstat:
10 files changed, 39 insertions(+), 33 deletions(-)
diff --git a/include/bits/amd64/arch/types.h b/include/bits/amd64/arch/types.h
@@ -1,5 +1,6 @@
/* TODO: Move these bits to other place */
+#define STACKADDR 0x7FFFFFFFFFFFFFF0
#define MAXTID 32767
#define NR_TASKS 16
#define NR_WINS 32
diff --git a/include/bits/arm64/arch/types.h b/include/bits/arm64/arch/types.h
@@ -1,5 +1,6 @@
/* TODO: Move these bits to other place */
+#define STACKADDR 0x7FFFFFFFFFFFFFF0
#define MAXTID 32767
#define NR_TASKS 16
#define NR_WINS 32
diff --git a/include/os9/os9.h b/include/os9/os9.h
@@ -257,6 +257,7 @@ extern noreturn void panic(const char *msg);
extern noreturn void fault(const char *msg, Context *ctx);
extern noreturn void swtch(Context *ctx);
extern noreturn void trap(Context *ctx);
+extern Ptable *initptable(Task *);
/* dev functions */
extern void idev(void);
@@ -270,6 +271,7 @@ extern void sched(void);
/* globals */
extern Chan *console;
+extern Mach mach;
/* per cpu globals */
extern Proc *proc;
diff --git a/scripts/fvp.sh b/scripts/fvp.sh
@@ -20,7 +20,7 @@ $FVP_PATH/FVP_Base_RevC-2xAEMv8A \
-C cluster1.cpu3.RVBAR=0x04001000 \
--data cluster0.cpu0=$bl31@0x04001000 \
--data cluster0.cpu0=$os@0x80000000 \
-
# --plugin /home/k0ga/models/FVP_Base_RevC-2xAEMv8A/plugins/Linux64_GCC-6.4/TarmacTrace.so \
+
# -C bp.pl011_uart0.out_file=$uart0 \
# -C bp.pl011_uart3.out_file=$uart3 \
diff --git a/src/os9/Makefile b/src/os9/Makefile
@@ -5,9 +5,9 @@ include $(PROJECTDIR)/scripts/rules.mk
OBJS =\
alloc.o\
dlang.o\
- init.o\
proc.o\
sched.o\
+ sys.o\
dev/builtin.o\
DIRS =\
diff --git a/src/os9/alloc.c b/src/os9/alloc.c
@@ -21,6 +21,8 @@ char buffertab[NR_BUFFERS][PAGESIZE];
void
freeb(void *bp)
{
+ if (!bp)
+ return;
/* TODO */
}
diff --git a/src/os9/arch/arm64/arch.h b/src/os9/arch/arm64/arch.h
@@ -20,8 +20,6 @@
#define EE (1ul << 25)
#define UCI (1ul << 26)
-extern Mach mach;
-
extern void main(Mach *);
extern void syswr(int, unsigned long long);
extern unsigned long long sysrd(int);
diff --git a/src/os9/arch/arm64/mmu.c b/src/os9/arch/arm64/mmu.c
@@ -140,7 +140,6 @@
#define NRALLOC 0ull
#define NWALLOC 0ull
-#define STACKADDR 0x7FFFFFFFFFFFFFF0
int inlowmem = 1;
@@ -262,31 +261,6 @@ vmap(phyaddr_t pa, uintptr_t va, int perm)
return 0;
}
-Map *
-newstack(Task *tp)
-{
- void *va;
- Map *mp = &tp->stack;
-
- if ((va = newpage()) == NULL)
- return NULL;
-
- initref(&mp->ref);
- mp->name = "stack";
- mp->perm = MW | MR;
-
- mp->pa =(phyaddr_t) PMEM(va);
- mp->va = STACKADDR;
- mp->siz = PAGESIZE;
-
- if (mapseg(mp) < 0) {
- freeb(va);
- return NULL;
- }
-
- return mp;
-}
-
void
taskmap(void)
{
diff --git a/src/os9/proc.c b/src/os9/proc.c
@@ -100,6 +100,7 @@ mapseg(Map *mp)
{
phyaddr_t pa;
uintptr_t va;
+ void *bp;
unsigned long i, n;
assert(mp->perm & MR);
@@ -113,13 +114,21 @@ mapseg(Map *mp)
(mp->perm & MX) ? 'x' : '-',
mp->siz);
- pa = mp->pa;
+ bp = NULL;
+ n = (mp->siz + PAGESIZE-1)/PAGESIZE;
va = mp->va;
+ pa = mp->pa;
+ if (pa == -1) {
+ if ((bp = allocb(n)) == NULL)
+ return -1;
+ pa = (phyaddr_t) PMEM(bp);
+ }
- n = (mp->siz + PAGESIZE-1)/PAGESIZE;
for (i = 0; i < n; i++) {
- if (vmap(pa, va, mp->perm) < 0)
+ if (vmap(pa, va, mp->perm) < 0) {
+ freeb(bp);
return -1;
+ }
pa += PAGESIZE;
va += PAGESIZE;
}
@@ -127,6 +136,25 @@ mapseg(Map *mp)
return 0;
}
+Map *
+newstack(Task *tp)
+{
+ Map *mp = &tp->stack;
+
+ initref(&mp->ref);
+ mp->name = "stack";
+ mp->perm = MW | MR;
+
+ mp->pa = -1;
+ mp->va = STACKADDR & (STACKADDR-1);
+ mp->siz = PAGESIZE;
+
+ if (mapseg(mp) < 0)
+ return NULL;
+
+ return mp;
+}
+
static Task *
newslot(void)
{
diff --git a/src/os9/init.c b/src/os9/sys.c