commit 7b27a41b2a63d4915a4406fd6b048acabb5f6b8c
parent 46767d51a3acb7a6c14d08b3380286b2e16c1788
Author: Roberto Vargas <roberto.vargas@arm.com>
Date: Thu, 2 May 2019 12:55:15 +0100
[dev] Add clone to Dev
It allows to the drivers to overload the default clone
behaviour.
Change-Id: If0d254ab5194ade57fab7c55df044c8b38857983
Diffstat:
7 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/drivers/dev.c b/drivers/dev.c
@@ -233,6 +233,12 @@ noent:
Chan *
clone(Chan *c, Chan *nc)
{
+ return devtab[c->type]->clone(c, nc);
+}
+
+Chan *
+devclone(Chan *c, Chan *nc)
+{
if (!nc && (nc = newchan(c->type)) == NULL)
return NULL;
diff --git a/drivers/dev.h b/drivers/dev.h
@@ -24,6 +24,7 @@ struct dirtab {
struct dev {
char id;
+ Chan * (*clone)(Chan *c, Chan *nc);
int (*walk)(Chan *c, const char *name);
Chan * (*attach)(int dev);
int (*read)(Chan *c, void *buf, int n);
@@ -47,7 +48,6 @@ struct attr {
extern Chan *devattach(int id, int dev);
-extern int devseek(Chan *c, long off, int whence);
extern Chan * namec(const char *name, int mode);
extern Chan *clone(Chan *c, Chan *nc);
extern void chanclose(Chan *c);
@@ -58,6 +58,9 @@ extern void mkentry(Chan *c, Dir *dir,
const char *name,
long length, Qid qid, unsigned mode);
extern void devlink(void);
+
+extern int devseek(Chan *c, long off, int whence);
+extern Chan *devclone(Chan *c, Chan *nc);
extern int devgen(Chan *c,
const Dirtab *tab, int ntab,
int n,
diff --git a/drivers/devar.c b/drivers/devar.c
@@ -198,6 +198,7 @@ err:
const Dev ardevtab = {
.id = 'R',
+ .clone = devclone,
.attach = arattach,
.walk = arwalk,
.read = arread,
diff --git a/drivers/devcons.c b/drivers/devcons.c
@@ -379,6 +379,7 @@ consread(Chan *c, void *buf, int n)
const Dev consdevtab = {
.id = 's',
+ .clone = devclone,
.attach = consattach,
.walk = conswalk,
.read = consread,
diff --git a/drivers/devfip.c b/drivers/devfip.c
@@ -246,6 +246,7 @@ err:
const Dev fipdevtab = {
.id = 'F',
+ .clone = devclone,
.attach = fipattach,
.walk = fipwalk,
.read = fipread,
diff --git a/drivers/devroot.c b/drivers/devroot.c
@@ -114,6 +114,7 @@ rootread(Chan *c, void *buf, int n)
const Dev rootdevtab = {
.id = '/',
+ .clone = devclone,
.attach = rootattach,
.walk = rootwalk,
.read = rootread,
diff --git a/drivers/devuart.c b/drivers/devuart.c
@@ -249,6 +249,7 @@ uartlink(Uartphy *phy, Attr *attr)
const Dev uartdevtab = {
.id = 't',
+ .clone = devclone,
.attach = uartattach,
.walk = uartwalk,
.read = uartread,