9os

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

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:
Minclude/bits/amd64/arch/types.h | 1+
Minclude/bits/arm64/arch/types.h | 1+
Minclude/os9/os9.h | 2++
Mscripts/fvp.sh | 2+-
Msrc/os9/Makefile | 2+-
Msrc/os9/alloc.c | 2++
Msrc/os9/arch/arm64/arch.h | 2--
Msrc/os9/arch/arm64/mmu.c | 26--------------------------
Msrc/os9/proc.c | 34+++++++++++++++++++++++++++++++---
Rsrc/os9/init.c -> src/os9/sys.c | 0
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