OpenCores
URL https://opencores.org/ocsvn/c0or1k/c0or1k/trunk

Subversion Repositories c0or1k

[/] [c0or1k/] [trunk/] [conts/] [posix/] [mm0/] [fs/] [romfs/] [romfs.c] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 drasko
#include <stdio.h>
2
#include <block.h>
3
#include <l4/lib/math.h>
4
#include <l4/macros.h>
5
#include <l4/types.h>
6
#include INC_GLUE(memory.h)
7
 
8
/*
9
 * Romfs superblock descriptor:
10
 *
11
 * All words are Big-Endian.
12
 *
13
 * Word 0: | - | r | o | m |
14
 * Word 1: | 1 | f | s | - |
15
 * Word 2: |      Size     | The number of bytes in this fs.
16
 * Word 3: |    Checksum   | The checksum of first 512 bytes.
17
 * Word 4: |  Volume Name  | The name of volume, padded to 16-byte boundary.
18
 * Rest:   |  File Headers | The rest of the data.
19
 */
20
struct romfs_superblock {
21
        u32 word0;
22
        u32 word1;
23
        u32 size;
24
        u32 checksum;
25
        char name[0];
26
};
27
 
28
struct romfs_inode {
29
        unsigned long mdata_size;       /* Size of metadata */
30
        unsigned long data_offset;      /* Offset of data from start of fs */
31
};
32
 
33
static u32
34
romfs_checksum(void *data)
35
{
36
        u32 sum = 0;
37
        u32 *ptr = data;
38
 
39
        size >>= 2;
40
        while (size > 0) {
41
                sum += be32_to_cpu(*ptr++);
42
                size--;
43
        }
44
        return sum;
45
}
46
 
47
int romfs_fill_super(struct superblock *sb)
48
{
49
        char buf[PAGE_SIZE];
50
        struct romfs_superblock *romfs_sb = (struct romfs_superblock *)buf;
51
        unsigned long vroot_offset;
52
        struct vnode *vroot;
53
 
54
        /* Read first page from block device */
55
        bdev_readpage(0, buf);
56
 
57
        /* Check superblock sanity */
58
        if (strcmp(be32_to_cpu(romfs_sb->word0), ROMFS_SB_WORD0)) {
59
                printf("Bad magic word 0\n");
60
        }
61
        if (strcmp(be32_to_cpu(romfs_sb->word1), ROMFS_SB_WORD1)) {
62
                printf("Bad magic word 1\n");
63
        }
64
        if (romfs_checksum(romfs_sb, min(romfs_sb->size, PAGE_SIZE))) {
65
                printf("Bad checksum.\n");
66
        }
67
 
68
        /* Copy some params to generic superblock */
69
        sb->size = be32_to_cpu(romfs_sb->size);
70
        sb->magic = ROMFS_MAGIC;
71
        sb->ops = romfs_ops;
72
 
73
        /* Offset of first vnode, which is the root vnode */
74
        vroot_offset = align_up(strnlen(romfs_sb->name, ROMFS_MAXNAME) + 1, 16);
75
        if (!(vroot = romfs_read_vnode(s, vroot_offset))) {
76
                printf("Error, could not get root inode.\n");
77
        }
78
 
79
        /* Get the dirent for this vnode */
80
        if (!(sb->root = new_dentry(vroot))) {
81
                printf("Error: Could not get new dentry for root vnode.\n");
82
        }
83
 
84
}
85
 
86
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.