about summary refs log blame commit diff stats
path: root/314divide.subx
blob: c0b855264201840ee81686b5f4bd00a42e797fab (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
















                                                                          
== code

integer-divide:  # a: int, b: int -> quotient/eax: int, remainder/edx: int
    # . prologue
    55/push-ebp
    89/<- %ebp 4/r32/esp
    # eax = a
    8b/-> *(ebp+8) 0/r32/eax
    # edx = all 0s or all 1s
    99/sign-extend-eax-into-edx
    # quotient, remainder = divide eax by b
    f7 7/subop/divide-eax-edx-by *(ebp+0xc)
$integer-divide:end:
    # . epilogue
    89/<- %esp 5/r32/ebp
    5d/pop-to-ebp
    c3/return
bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
#include "ramdisk.h"
#include "alloc.h"
#include "fs.h"
#include "devfs.h"

typedef struct Ramdisk {
    uint8* buffer;
    uint32 size;
} Ramdisk;

#define RAMDISK_BLOCKSIZE 512

static BOOL open(File *file, uint32 flags);
static void close(File *file);
static int32 readBlock(FileSystemNode* node, uint32 blockNumber, uint32 count, uint8* buffer);
static int32 writeBlock(FileSystemNode* node, uint32 blockNumber, uint32 count, uint8* buffer);
static int32 ioctl(File *node, int32 request, void * argp);

BOOL createRamdisk(const char* devName, uint32 size) {
    Ramdisk* ramdisk = kmalloc(sizeof(Ramdisk));
    ramdisk->size = size;
    ramdisk->buffer = kmalloc(size);

    Device device;
    memset((uint8*)&device, 0, sizeof(device));
    strcpy(device.name, devName);
    device.deviceType = FT_BlockDevice;
    device.open = open;
    device.close = close;
    device.readBlock = readBlock;
    device.writeBlock = writeBlock;
    device.ioctl = ioctl;
    device.privateData = ramdisk;

    if (registerDevice(&device)) {
        return TRUE;
    }

    kfree(ramdisk->buffer);
    kfree(ramdisk);

    return FALSE;
}

static BOOL open(File *file, uint32 flags) {
    return TRUE;
}

static void close(File *file) {
}

static int32 readBlock(FileSystemNode* node, uint32 blockNumber, uint32 count, uint8* buffer) {
    Ramdisk* ramdisk = (Ramdisk*)node->privateNodeData;

    uint32 location = blockNumber * RAMDISK_BLOCKSIZE;
    uint32 size = count * RAMDISK_BLOCKSIZE;

    if (location + size > ramdisk->size) {
        return -1;
    }

    beginCriticalSection();

    memcpy(buffer, ramdisk->buffer + location, size);

    endCriticalSection();

    return 0;
}

static int32 writeBlock(FileSystemNode* node, uint32 blockNumber, uint32 count, uint8* buffer) {
    Ramdisk* ramdisk = (Ramdisk*)node->privateNodeData;

    uint32 location = blockNumber * RAMDISK_BLOCKSIZE;
    uint32 size = count * RAMDISK_BLOCKSIZE;

    if (location + size > ramdisk->size) {
        return -1;
    }

    beginCriticalSection();

    memcpy(ramdisk->buffer + location, buffer, size);

    endCriticalSection();

    return 0;
}

static int32 ioctl(File *node, int32 request, void * argp) {
    Ramdisk* ramdisk = (Ramdisk*)node->node->privateNodeData;

    uint32* result = (uint32*)argp;

    switch (request) {
    case IC_GetSectorCount:
        *result = ramdisk->size / RAMDISK_BLOCKSIZE;
        return 0;
        break;
    case IC_GetSectorSizeInBytes:
        *result = RAMDISK_BLOCKSIZE;
        return 0;
        break;
    default:
        break;
    }

    return -1;
}