. made memory parsing function into a library call

(moved 'struct memory' to <minix/type.h> for this library call)
 . removed some debugging messages from pci library
This commit is contained in:
Ben Gras 2007-02-16 15:54:28 +00:00
parent a47531cc97
commit 3275602598
5 changed files with 58 additions and 10 deletions

View file

@ -2,3 +2,5 @@ _PROTOTYPE( int env_parse, (char *env, char *fmt, int field,
long *param, long min, long max) );
_PROTOTYPE( void env_panic, (char *env) );
_PROTOTYPE( int env_prefix, (char *env, char *prefix) );
_PROTOTYPE( int env_memory_parse, (struct memory *chunks, int nchunks) );

View file

@ -170,4 +170,10 @@ struct exec_newmem
char progname[16]; /* Should be at least PROC_NAME_LEN */
};
/* Memory chunks. */
struct memory {
phys_bytes base;
phys_bytes size;
};
#endif /* _TYPE_H */

View file

@ -27,11 +27,6 @@ struct boot_image {
endpoint_t endpoint; /* endpoint number when started */
};
struct memory {
phys_clicks base; /* start address of chunk */
phys_clicks size; /* size of memory chunk */
};
/* The kernel outputs diagnostic messages in a circular buffer. */
struct kmessages {
int km_next; /* next index to write */

View file

@ -30,10 +30,8 @@ struct rs_pci *rs_pci;
}
printf("pci_set_acl: before cpf_grant_direct\n");
gid= cpf_grant_direct(pci_procnr, (vir_bytes)rs_pci, sizeof(*rs_pci),
CPF_READ);
printf("pci_set_acl: after cpf_grant_direct: gid %d\n", gid);
if (gid == -1)
{
printf("pci_set_acl: cpf_grant_direct failed: %d\n",
@ -44,11 +42,8 @@ printf("pci_set_acl: after cpf_grant_direct: gid %d\n", gid);
m.m_type= BUSC_PCI_ACL;
m.m1_i1= gid;
printf("pci_set_acl: before sendrec to %d\n", pci_procnr);
r= sendrec(pci_procnr, &m);
printf("pci_set_acl: after sendrec to %d\n", pci_procnr);
cpf_revoke(gid);
printf("pci_set_acl: after cpf_revoke\n");
if (r != 0)
panic("pci", "pci_set_acl: can't talk to PCI", r);

View file

@ -1,5 +1,6 @@
#include "sysutil.h"
#include <stdlib.h>
#include <env.h>
#include <string.h>
@ -88,4 +89,53 @@ badenv:
return -1;
}
/*=========================================================================*
* env_memory_parse *
*=========================================================================*/
PUBLIC int env_memory_parse(mem_chunks, maxchunks)
struct memory *mem_chunks; /* where to store the memory bits */
int maxchunks; /* how many were found */
{
int i, done = 0;
char *s;
struct memory *memp;
char memstr[100], *end;
/* Initialize everything to zero. */
for (i = 0; i < maxchunks; i++) {
memp = &mem_chunks[i]; /* next mem chunk is stored here */
memp->base = memp->size = 0;
}
/* The available memory is determined by MINIX' boot loader as a list of
* (base:size)-pairs in boothead.s. The 'memory' boot variable is set in
* in boot.s. The format is "b0:s0,b1:s1,b2:s2", where b0:s0 is low mem,
* b1:s1 is mem between 1M and 16M, b2:s2 is mem above 16M. Pairs b1:s1
* and b2:s2 are combined if the memory is adjacent.
*/
if(env_get_param("memory", memstr, sizeof(memstr)-1) != OK)
return -1;
s = memstr;
for (i = 0; i < maxchunks && !done; i++) {
phys_bytes base = 0, size = 0, limit;
memp = &mem_chunks[i]; /* next mem chunk is stored here */
if (*s != 0) { /* get fresh data, unless at end */
/* Read fresh base and expect colon as next char. */
base = strtoul(s, &end, 0x10); /* get number */
if (end != s && *end == ':') s = ++end; /* skip ':' */
else *s=0; /* terminate, should not happen */
/* Read fresh size and expect comma or assume end. */
size = strtoul(s, &end, 0x10); /* get number */
if (end != s && *end == ',') s = ++end; /* skip ',' */
else done = 1;
}
if (base + size <= base) continue;
memp->base = base;
memp->size = size;
}
return OK;
}