Commit 8c0d2761 authored by bzt's avatar bzt

Shell stuff

parent 6804fefb
--- Error fixes ---
./src/drivers/fs/fsz/main.c:196: // FIXME: block end reached, load next block from sdblk and alter dirent pointer
./src/drivers/fs/fsz/main.c:195: // FIXME: block end reached, load next block from sdblk and alter dirent pointer
./src/drivers/ui/tty/vt.c:91: // FIXME: recalc new nsb with new tty->w
./src/ui/compositor.c:88: // FIXME: use compositor pixbuf or focused window's pixbuf if it's fullscreen
./src/ui/libui.c:51: // FIXME: this sets font globally in UI context, not just for this window
......@@ -12,8 +12,8 @@
--- Features ---
./src/init/services.c:36: // TODO: load and start user services
./src/drivers/display/fb/main.c:116: // TODO: if second monitor found, register display "1" too
./src/drivers/fs/fsz/main.c:142: // TODO: extents
./src/drivers/fs/fsz/main.c:235: // TODO: if loc->creat, then create dir or path
./src/drivers/fs/fsz/main.c:141: // TODO: extents
./src/drivers/fs/fsz/main.c:234: // TODO: if loc->creat, then create dir or path
./src/fs/vfs.c:575: // TODO: handle up directory
./src/fs/vfs.c:578: // TODO: detect file system in image
./src/ui/display.c:81: // TODO: if display not found by this name, create a remote display instance
......
......@@ -6,7 +6,6 @@ Requirements
- GNU toolchain (make, gcc, binutils (gas, ld, objcopy, strip), see [tools/cross-gcc.sh](https://gitlab.com/bztsrc/osz/blob/master/tools/cross-gcc.sh))
- bash or dash (shell scripts are used to [generate different files](https://gitlab.com/bztsrc/osz/blob/master/tools/drivers.sh) during compilation)
- optionally fasm (for recompiling BIOS booting)
Configuration
-------------
......@@ -91,7 +90,7 @@ Non-EFI loader
If you want to recompile `loader/boot.bin` and `loader/bootboot.bin`, you'll need [fasm](http://flatassembler.net).
Unfortunately GAS is not good enough at mixing 16, 32 and 64 bit instuctions, which is necessary for BIOS booting. To keep
my promise that you'll only need the GNU toolchain, I've added those pre-compiled binaries to the source.
my promise that you'll only need the GNU toolchain, I've added those pre-compiled BOOTBOOT binaries to the source.
See what you've done!
---------------------
......
......@@ -4,14 +4,14 @@ FS/Z File System
It was designed to store unimagineable amounts of data. It's a classic UNIX type file system with inodes and superblock
but without their limitations. There's no limit on number of files or directories in FS/Z (save storage capacity).
Logical sector numbers are stored in 2^128 bits to be future proof. Current implementation
only uses 2^64 bits (can handle drives up to 64 Zettabytes with 4096 bytes logical sector size).
only uses 2^64 bits (can handle drives up to 64 Zettabytes with 4096 bytes logical sector size, and 1 Yottabyte with 64k logical sector size).
The file system is designed to be recoverable by `fsck` as much as possible. A totally screwed up superblock can be reconstructed
by examining the sectors on a disk, looking for inodes of meta data.
Block size can be 2048, 4096, 8192... etc. The suggested size matches the memory page size on the architecture. That is 4096
Logical sector size can be 2048, 4096, 8192... etc. The suggested size matches the memory page size on the architecture. That is 4096
for x86_64 and aarch64.
The file system is designed to be recoverable by `fsck` as much as possible. A totally screwed up superblock can be reconstructed
by examining the sectors on a disk, looking for inodes of meta data. RAID mirroring is also possible with this file system.
For detailed bit level specification and on disk format see [fsZ.h](https://gitlab.com/bztsrc/osz/blob/master/etc/include/sys/fsZ.h). For
the higher level abstraction layer, see [VFS](https://gitlab.com/bztsrc/osz/blob/master/docs/vfs.md).
......@@ -25,7 +25,7 @@ The file system driver is implemented 3 times:
FS/Z Super Block
----------------
The super block is the first sector of the media and optionally repeated in the last sector. If the superblocks differ, they have
The super block is the first logical sector of the media and optionally repeated in the last sector. If the superblocks differ, they have
checksums to decide which sector is correct.
Logical Sector Number
......
......@@ -38,7 +38,7 @@ msg_t *mq_recv();
/* sync, dispatch events (blocking, noreturn) */
void mq_dispatch();
```
While [mq_call()](https://gitlab.com/bztsrc/osz/blob/master/src/libc/x86_64/syscall.S) is a sequence of mq_send() and my_recv() calls, [mq_dispatch()](https://gitlab.com/bztsrc/osz/blob/master/src/lib/libc/dispatch.c) is quite the opposite: it first
While [mq_call()](https://gitlab.com/bztsrc/osz/blob/master/src/libc/x86_64/stdlib.S) is a sequence of mq_send() and my_recv() calls, [mq_dispatch()](https://gitlab.com/bztsrc/osz/blob/master/src/lib/libc/dispatch.c) is quite the opposite: it first
receives a message with mq_recv(), calls the handler for it, and then uses mq_send() to send the result back. For msg_t struct, see below.
You can also pass a system service number as `dst`, they can be found in [etc/include/syscall.h](https://gitlab.com/bztsrc/osz/blob/master/etc/include/syscall.h). The available function codes
......@@ -65,11 +65,12 @@ bool_t msg_sends(
uint64_t arg4,
uint64_t arg5);
bool_t msg_syscall(
bool_t msg_core(
evt_t event,
uint64_t arg0,
uint64_t arg1,
uint64_t arg2);
uint64_t arg2,
uint64_t arg3);
)
```
......@@ -100,7 +101,7 @@ void ksend(
It's an efficient assembly implementation of copying msg_t into the queue and handle start / end indeces. The `msg_sends()`
function calls it after it had mapped the destination's task message queue temporarily.
From userspace the message queue routines can be accessed via `syscall` instruction on x86_64, and `svc` instruction
From userspace (EL0 / Ring 3) the message queue routines can be accessed via `syscall` instruction on x86_64, and `svc` instruction
on AArch64. The low level user library builds on those (basically mq_send() and mq_recv() and all the other libc functions are just
wrappers). The destination and function is passed in %rax/r0. When destination is SRV_CORE (0) and function is SYS_recv (0x3FFF),
it receives messages. Any other value sends.
......
......@@ -18,7 +18,7 @@ the platform. The loader is not strictly part of the OS, as it can load kernels
Porting core
------------
Note there's a distinction between platform and architecture. The latter only includes the CPU with some essentional
Note there's a distinction between platform and architecture. The latter only includes the CPU with some essential
features like MMU or FPU (usually built-in the CPU, but not necessairly), while the former includes everything shipped on
the motherboard or SoC (usually not replaceable by the end user), like interrupt controllers, nvram, PCI(e) bus and
BIOS or UEFI firmware.
......@@ -63,14 +63,14 @@ Device drivers have to be written for each and every platform. Some [drivers are
and can be used on different platforms as-is, but it's most likely they have some Assembly parts and platform specific
implementation in C. To help with that, the build system looks for a [platforms](https://gitlab.com/bztsrc/osz/blob/master/docs/drivers.md)
file which lists all platforms that the driver supports. Likewise there's a `devices` file which lists device specifications
that `core` uses during system bus enumeration to detect if any of the supperted devices exist on the configuration
that `core` uses during system bus enumeration to detect if any of the supported devices exist on the configuration
it's booting on.
Device driver tasks are running at a [higher priority level](https://gitlab.com/bztsrc/osz/blob/master/docs/scheduler.md)
than other user space tasks, and they are allowed to use some driver specific `libc` functions, like
[setirq()](https://gitlab.com/bztsrc/osz/blob/master/etc/include/sys/driver.h). Also they are allowed to access IO space
(which can mean to use specific instructions like inb/outb or passing MMIO addresses to mmap() call depending which
one is supported by the architecture).
(which can mean to use specific instructions like inb/outb or accesing MMIO addresses depending which one is supported by the
architecture).
Porting libc
------------
......@@ -78,11 +78,10 @@ Porting libc
This shared library is called `libc` for historic reasons, in reality it's a platform independent interface
to all OS/Z functions, so should be called `libosz`. It provides library functions for user space services, libraries
and applications as well as for device drivers. It's mostly written in C, but some parts had to be written in Assembly
(like memcpy() for performance and calling a supervisor mode service in `core` to support native instructions). It hides
all the details of low level messaging, but just in case also provides a platform independent,
[user level abstraction for messaging](https://gitlab.com/bztsrc/osz/blob/master/docs/messages.md#low-level-user-library-aka-syscalls).
(like memcpy() for performance, and calling a supervisor mode routine in `core`). It hides all the details of low level
messaging, but just in case also provides a platform independent, [user level abstraction for messaging](https://gitlab.com/bztsrc/osz/blob/master/docs/messages.md#low-level-user-library-aka-syscalls).
All programs compiled for OS/Z must be dynamically linked with `libc`, and must not use other, lower level abstractions
All programs compiled for OS/Z must be dynamically linked with this `libc`, and must not use other, lower level abstractions
(like syscall/svc interface) directly. At `libc` level, OS/Z is totally platform independent.
Porting libraries and applications
......@@ -107,4 +106,5 @@ implemented for all the platforms. The pixbuf library in `libui` would be a perf
Because it is the `libc` level where OS/Z becames platform independent, unit and functionality
[tests](https://gitlab.com/bztsrc/osz/blob/master/src/test) are provided for this level and above, but not for lower
levels.
levels. This means you can compile the system tests to a new platform as-is, and if it runs without error, your core and libc
port is correct.
#ifndef _CRC32C__
#define _CRC32C__
//precalculated CRC32c lookup table for polynomial 0x1EDC6F41 (castagnoli-crc)
unsigned long int crc32c_lookup[256]={
0x00000000L, 0xF26B8303L, 0xE13B70F7L, 0x1350F3F4L, 0xC79A971FL, 0x35F1141CL, 0x26A1E7E8L, 0xD4CA64EBL,
0x8AD958CFL, 0x78B2DBCCL, 0x6BE22838L, 0x9989AB3BL, 0x4D43CFD0L, 0xBF284CD3L, 0xAC78BF27L, 0x5E133C24L,
0x105EC76FL, 0xE235446CL, 0xF165B798L, 0x030E349BL, 0xD7C45070L, 0x25AFD373L, 0x36FF2087L, 0xC494A384L,
0x9A879FA0L, 0x68EC1CA3L, 0x7BBCEF57L, 0x89D76C54L, 0x5D1D08BFL, 0xAF768BBCL, 0xBC267848L, 0x4E4DFB4BL,
0x20BD8EDEL, 0xD2D60DDDL, 0xC186FE29L, 0x33ED7D2AL, 0xE72719C1L, 0x154C9AC2L, 0x061C6936L, 0xF477EA35L,
0xAA64D611L, 0x580F5512L, 0x4B5FA6E6L, 0xB93425E5L, 0x6DFE410EL, 0x9F95C20DL, 0x8CC531F9L, 0x7EAEB2FAL,
0x30E349B1L, 0xC288CAB2L, 0xD1D83946L, 0x23B3BA45L, 0xF779DEAEL, 0x05125DADL, 0x1642AE59L, 0xE4292D5AL,
0xBA3A117EL, 0x4851927DL, 0x5B016189L, 0xA96AE28AL, 0x7DA08661L, 0x8FCB0562L, 0x9C9BF696L, 0x6EF07595L,
0x417B1DBCL, 0xB3109EBFL, 0xA0406D4BL, 0x522BEE48L, 0x86E18AA3L, 0x748A09A0L, 0x67DAFA54L, 0x95B17957L,
0xCBA24573L, 0x39C9C670L, 0x2A993584L, 0xD8F2B687L, 0x0C38D26CL, 0xFE53516FL, 0xED03A29BL, 0x1F682198L,
0x5125DAD3L, 0xA34E59D0L, 0xB01EAA24L, 0x42752927L, 0x96BF4DCCL, 0x64D4CECFL, 0x77843D3BL, 0x85EFBE38L,
0xDBFC821CL, 0x2997011FL, 0x3AC7F2EBL, 0xC8AC71E8L, 0x1C661503L, 0xEE0D9600L, 0xFD5D65F4L, 0x0F36E6F7L,
0x61C69362L, 0x93AD1061L, 0x80FDE395L, 0x72966096L, 0xA65C047DL, 0x5437877EL, 0x4767748AL, 0xB50CF789L,
0xEB1FCBADL, 0x197448AEL, 0x0A24BB5AL, 0xF84F3859L, 0x2C855CB2L, 0xDEEEDFB1L, 0xCDBE2C45L, 0x3FD5AF46L,
0x7198540DL, 0x83F3D70EL, 0x90A324FAL, 0x62C8A7F9L, 0xB602C312L, 0x44694011L, 0x5739B3E5L, 0xA55230E6L,
0xFB410CC2L, 0x092A8FC1L, 0x1A7A7C35L, 0xE811FF36L, 0x3CDB9BDDL, 0xCEB018DEL, 0xDDE0EB2AL, 0x2F8B6829L,
0x82F63B78L, 0x709DB87BL, 0x63CD4B8FL, 0x91A6C88CL, 0x456CAC67L, 0xB7072F64L, 0xA457DC90L, 0x563C5F93L,
0x082F63B7L, 0xFA44E0B4L, 0xE9141340L, 0x1B7F9043L, 0xCFB5F4A8L, 0x3DDE77ABL, 0x2E8E845FL, 0xDCE5075CL,
0x92A8FC17L, 0x60C37F14L, 0x73938CE0L, 0x81F80FE3L, 0x55326B08L, 0xA759E80BL, 0xB4091BFFL, 0x466298FCL,
0x1871A4D8L, 0xEA1A27DBL, 0xF94AD42FL, 0x0B21572CL, 0xDFEB33C7L, 0x2D80B0C4L, 0x3ED04330L, 0xCCBBC033L,
0xA24BB5A6L, 0x502036A5L, 0x4370C551L, 0xB11B4652L, 0x65D122B9L, 0x97BAA1BAL, 0x84EA524EL, 0x7681D14DL,
0x2892ED69L, 0xDAF96E6AL, 0xC9A99D9EL, 0x3BC21E9DL, 0xEF087A76L, 0x1D63F975L, 0x0E330A81L, 0xFC588982L,
0xB21572C9L, 0x407EF1CAL, 0x532E023EL, 0xA145813DL, 0x758FE5D6L, 0x87E466D5L, 0x94B49521L, 0x66DF1622L,
0x38CC2A06L, 0xCAA7A905L, 0xD9F75AF1L, 0x2B9CD9F2L, 0xFF56BD19L, 0x0D3D3E1AL, 0x1E6DCDEEL, 0xEC064EEDL,
0xC38D26C4L, 0x31E6A5C7L, 0x22B65633L, 0xD0DDD530L, 0x0417B1DBL, 0xF67C32D8L, 0xE52CC12CL, 0x1747422FL,
0x49547E0BL, 0xBB3FFD08L, 0xA86F0EFCL, 0x5A048DFFL, 0x8ECEE914L, 0x7CA56A17L, 0x6FF599E3L, 0x9D9E1AE0L,
0xD3D3E1ABL, 0x21B862A8L, 0x32E8915CL, 0xC083125FL, 0x144976B4L, 0xE622F5B7L, 0xF5720643L, 0x07198540L,
0x590AB964L, 0xAB613A67L, 0xB831C993L, 0x4A5A4A90L, 0x9E902E7BL, 0x6CFBAD78L, 0x7FAB5E8CL, 0x8DC0DD8FL,
0xE330A81AL, 0x115B2B19L, 0x020BD8EDL, 0xF0605BEEL, 0x24AA3F05L, 0xD6C1BC06L, 0xC5914FF2L, 0x37FACCF1L,
0x69E9F0D5L, 0x9B8273D6L, 0x88D28022L, 0x7AB90321L, 0xAE7367CAL, 0x5C18E4C9L, 0x4F48173DL, 0xBD23943EL,
0xF36E6F75L, 0x0105EC76L, 0x12551F82L, 0xE03E9C81L, 0x34F4F86AL, 0xC69F7B69L, 0xD5CF889DL, 0x27A40B9EL,
0x79B737BAL, 0x8BDCB4B9L, 0x988C474DL, 0x6AE7C44EL, 0xBE2DA0A5L, 0x4C4623A6L, 0x5F16D052L, 0xAD7D5351L
};
//precalculated crc lookup table for EFI (ansi-crc)
unsigned long int crc32_lookup[256]={
0x00000000,0x77073096,0xee0e612c,0x990951ba,0x076dc419,0x706af48f,0xe963a535,0x9e6495a3,0x0edb8832,
0x79dcb8a4,0xe0d5e91e,0x97d2d988,0x09b64c2b,0x7eb17cbd,0xe7b82d07,0x90bf1d91,0x1db71064,0x6ab020f2,
0xf3b97148,0x84be41de,0x1adad47d,0x6ddde4eb,0xf4d4b551,0x83d385c7,0x136c9856,0x646ba8c0,0xfd62f97a,
0x8a65c9ec,0x14015c4f,0x63066cd9,0xfa0f3d63,0x8d080df5,0x3b6e20c8,0x4c69105e,0xd56041e4,0xa2677172,
0x3c03e4d1,0x4b04d447,0xd20d85fd,0xa50ab56b,0x35b5a8fa,0x42b2986c,0xdbbbc9d6,0xacbcf940,0x32d86ce3,
0x45df5c75,0xdcd60dcf,0xabd13d59,0x26d930ac,0x51de003a,0xc8d75180,0xbfd06116,0x21b4f4b5,0x56b3c423,
0xcfba9599,0xb8bda50f,0x2802b89e,0x5f058808,0xc60cd9b2,0xb10be924,0x2f6f7c87,0x58684c11,0xc1611dab,
0xb6662d3d,0x76dc4190,0x01db7106,0x98d220bc,0xefd5102a,0x71b18589,0x06b6b51f,0x9fbfe4a5,0xe8b8d433,
0x7807c9a2,0x0f00f934,0x9609a88e,0xe10e9818,0x7f6a0dbb,0x086d3d2d,0x91646c97,0xe6635c01,0x6b6b51f4,
0x1c6c6162,0x856530d8,0xf262004e,0x6c0695ed,0x1b01a57b,0x8208f4c1,0xf50fc457,0x65b0d9c6,0x12b7e950,
0x8bbeb8ea,0xfcb9887c,0x62dd1ddf,0x15da2d49,0x8cd37cf3,0xfbd44c65,0x4db26158,0x3ab551ce,0xa3bc0074,
0xd4bb30e2,0x4adfa541,0x3dd895d7,0xa4d1c46d,0xd3d6f4fb,0x4369e96a,0x346ed9fc,0xad678846,0xda60b8d0,
0x44042d73,0x33031de5,0xaa0a4c5f,0xdd0d7cc9,0x5005713c,0x270241aa,0xbe0b1010,0xc90c2086,0x5768b525,
0x206f85b3,0xb966d409,0xce61e49f,0x5edef90e,0x29d9c998,0xb0d09822,0xc7d7a8b4,0x59b33d17,0x2eb40d81,
0xb7bd5c3b,0xc0ba6cad,0xedb88320,0x9abfb3b6,0x03b6e20c,0x74b1d29a,0xead54739,0x9dd277af,0x04db2615,
0x73dc1683,0xe3630b12,0x94643b84,0x0d6d6a3e,0x7a6a5aa8,0xe40ecf0b,0x9309ff9d,0x0a00ae27,0x7d079eb1,
0xf00f9344,0x8708a3d2,0x1e01f268,0x6906c2fe,0xf762575d,0x806567cb,0x196c3671,0x6e6b06e7,0xfed41b76,
0x89d32be0,0x10da7a5a,0x67dd4acc,0xf9b9df6f,0x8ebeeff9,0x17b7be43,0x60b08ed5,0xd6d6a3e8,0xa1d1937e,
0x38d8c2c4,0x4fdff252,0xd1bb67f1,0xa6bc5767,0x3fb506dd,0x48b2364b,0xd80d2bda,0xaf0a1b4c,0x36034af6,
0x41047a60,0xdf60efc3,0xa867df55,0x316e8eef,0x4669be79,0xcb61b38c,0xbc66831a,0x256fd2a0,0x5268e236,
0xcc0c7795,0xbb0b4703,0x220216b9,0x5505262f,0xc5ba3bbe,0xb2bd0b28,0x2bb45a92,0x5cb36a04,0xc2d7ffa7,
0xb5d0cf31,0x2cd99e8b,0x5bdeae1d,0x9b64c2b0,0xec63f226,0x756aa39c,0x026d930a,0x9c0906a9,0xeb0e363f,
0x72076785,0x05005713,0x95bf4a82,0xe2b87a14,0x7bb12bae,0x0cb61b38,0x92d28e9b,0xe5d5be0d,0x7cdcefb7,
0x0bdbdf21,0x86d3d2d4,0xf1d4e242,0x68ddb3f8,0x1fda836e,0x81be16cd,0xf6b9265b,0x6fb077e1,0x18b74777,
0x88085ae6,0xff0f6a70,0x66063bca,0x11010b5c,0x8f659eff,0xf862ae69,0x616bffd3,0x166ccf45,0xa00ae278,
0xd70dd2ee,0x4e048354,0x3903b3c2,0xa7672661,0xd06016f7,0x4969474d,0x3e6e77db,0xaed16a4a,0xd9d65adc,
0x40df0b66,0x37d83bf0,0xa9bcae53,0xdebb9ec5,0x47b2cf7f,0x30b5ffe9,0xbdbdf21c,0xcabac28a,0x53b39330,
0x24b4a3a6,0xbad03605,0xcdd70693,0x54de5729,0x23d967bf,0xb3667a2e,0xc4614ab8,0x5d681b02,0x2a6f2b94,
0xb40bbe37,0xc30c8ea1,0x5a05df1b,0x2d02ef8d};
//calculate CRC32c checksum
unsigned int crc32_calc(char *start,int length)
{
unsigned int crc32_val=0;
while(length--) crc32_val=(crc32_val>>8)^crc32c_lookup[(crc32_val&0xff)^(unsigned char)*start++];
return crc32_val;
}
//calculate EFI compatible crc
unsigned int eficrc32_calc(char *start,int length)
{
//init
unsigned int crc32_val=0xffffffff;
//calculate
while(length--) crc32_val=(crc32_val>>8)^crc32_lookup[(crc32_val&0xff)^(unsigned char)*start++];
//finalize
crc32_val^=0xffffffff;
return crc32_val;
}
#endif /* crc32.h */
......@@ -71,6 +71,10 @@ extern void dbg_printf(char * fmt, ...);
extern char _osver[];
extern char _lang[];
/* Circular Redundancy Check */
uint32_t crc32_calc(char *start,int length);
uint32_t eficrc32_calc(char *start,int length);
/* Multilanguage support */
/* append dot language code to prefix, and read it into txt up to txtc lines. Returns number of lines parsed */
extern int lang_init(char *prefix, int txtc, char **txt);
......
......@@ -4,6 +4,6 @@ VERSION = "0.0.1a"
HOME_URL = "https://gitlab.com/bztsrc/osz"
SUPPORT_URL = "https://gitlab.com/bztsrc/osz/issues"
BUG_REPORT_URL = "https://gitlab.com/bztsrc/osz/issues"
BUILD = "2018-07-17 18:09:56 UTC"
BUILD = "2018-07-17 21:47:30 UTC"
ARCH = "x86_64"
PLATFORM = "ibmpc"
......@@ -204,7 +204,7 @@ uint64_t msg_sends(evt_t event, uint64_t arg0, uint64_t arg1, uint64_t arg2, uin
* System call dispatcher for messages sent to SRV_CORE. Also has a low level part,
* isr_syscall in (platform)/isrc.S. We only came here if message is not handled there
*/
uint64_t msg_syscall(evt_t event, uint64_t arg0, uint64_t arg1, uint64_t arg2, uint64_t arg3)
uint64_t msg_core(evt_t event, uint64_t arg0, uint64_t arg1, uint64_t arg2, uint64_t arg3)
{
tcb_t *tcb = (tcb_t*)0;
tcb_t *dsttcb = (tcb_t*)&tmpmap;
......
......@@ -92,7 +92,7 @@ isr_loadcontext:
ret
/**
* syscall dispatcher, platform dependent wrapper around msg_syscall() and msg_send()
* syscall dispatcher, platform dependent wrapper around msg_core() and msg_send()
* performance hacks and special access checks mostly
*/
.align 16, 0x90
......@@ -260,13 +260,13 @@ isr_syscall:
call isr_enableirq
jmp 9f
/* syscall or message send */
/* message send */
3: movq %rcx, %r8
movq %rdx, %rcx
movq %rsi, %rdx
movq %rdi, %rsi
movq %rax, %rdi
call msg_syscall
call msg_core
jmp 9f
4: pushq %r10
pushq %r9
......
......@@ -28,7 +28,6 @@
#include <osZ.h>
#include <vfs.h>
#include <sys/fsZ.h>
#include <crc32.h>
#define MAXINDIRECT 8
......
......@@ -35,17 +35,28 @@
extern uint64_t _initrd_size;
/* devices */
uint64_t ndev = 0;
uint32_t ndev = 0;
devfs_t *dev = NULL;
uint64_t dev_recent = 0;
uint32_t *devidx = NULL;
/**
* helper function to compare devices
*/
int devfs_cmp(void *a, void *b)
{
if(*(uint32_t*)a==-1) return 1;
if(*(uint32_t*)b==-1) return -1;
return strcmp(fcb[dev[*(uint32_t*)b].fid].abspath, fcb[dev[*(uint32_t*)a].fid].abspath);
}
/**
* add a device
*/
uint64_t devfs_add(char *name, pid_t drivertask, dev_t device, mode_t mode, blksize_t blksize, blkcnt_t blkcnt)
uint32_t devfs_add(char *name, pid_t drivertask, dev_t device, mode_t mode, blksize_t blksize, blkcnt_t blkcnt)
{
uint64_t i,s;
uint32_t i,s;
fid_t f;
char tmp[64+sizeof(DEVPATH)]=DEVPATH;
strncpy(&tmp[5], name, 64);
......@@ -55,8 +66,9 @@ uint64_t devfs_add(char *name, pid_t drivertask, dev_t device, mode_t mode, blks
ndev++;
fcb[1].reg.filesize=s=ndev*sizeof(devfs_t);
dev=(devfs_t*)realloc(dev, s);
devidx=realloc(devidx, ndev*sizeof(uint32_t));
// abort if we cannot allocate devfs
if(dev==NULL)
if(dev==NULL || devidx==NULL)
exit(2);
f=fcb_add(tmp, FCB_TYPE_DEVICE);
fcb[f].nopen++;
......@@ -69,13 +81,15 @@ uint64_t devfs_add(char *name, pid_t drivertask, dev_t device, mode_t mode, blks
dev[i].drivertask=drivertask;
dev[i].device=device;
dev[i].recent=++dev_recent;
devidx[i]=i;
qsort(devidx, ndev, sizeof(uint32_t), devfs_cmp);
return i;
}
/**
* remove a device
*/
void devfs_del(uint64_t idx)
void devfs_del(uint32_t idx)
{
int i;
if(idx==-1 || idx>=ndev)
......@@ -107,6 +121,10 @@ void devfs_del(uint64_t idx)
ndev=i;
dev=(devfs_t*)realloc(dev,ndev*sizeof(devfs_t));
}
for(i=0;i<ndev;i++)
if(devidx[i]==idx) devidx[i]=-1;
qsort(devidx, ndev, sizeof(uint32_t), devfs_cmp);
devidx=(uint32_t*)realloc(devidx,ndev*sizeof(uint32_t));
// we don't remove taskctx with open files on the device, as they will
// automatically report feof() / ferror() on next operation
}
......@@ -114,9 +132,9 @@ void devfs_del(uint64_t idx)
/**
* mark a device used
*/
void devfs_used(uint64_t idx)
void devfs_used(uint32_t idx)
{
uint64_t i;
uint32_t i;
if(idx==-1 || idx>=ndev)
return;
// overflow protection, just to be bullet proof :-)
......@@ -134,9 +152,9 @@ void devfs_used(uint64_t idx)
/**
* get the last recently used device
*/
uint64_t devfs_lastused(bool_t all)
uint32_t devfs_lastused(bool_t all)
{
uint64_t i,l=0,k=dev_recent;
uint32_t i,l=0,k=dev_recent;
for(i=0;i<ndev;i++)
if(dev[i].fid!=-1 && dev[i].recent<k && (all || dev[i].recent!=0)) {
k=dev[i].recent;
......@@ -155,11 +173,11 @@ public size_t devfs_getdirent(fpos_t offs)
fcb_t *f;
size_t s=1;
// handle empty slots
while(offs!=-1 && offs<ndev && dev[offs].fid==-1) { s++; offs++; }
while(offs!=-1 && offs<ndev && devidx[offs]!=-1 && dev[devidx[offs]].fid==-1) { s++; offs++; }
// handle EOF
if(offs==-1 || offs>=ndev) return 0;
if(offs==-1 || offs>=ndev || devidx[offs]==-1) return 0;
// fill in dirent struct fields
f=&fcb[dev[offs].fid];
f=&fcb[dev[devidx[offs]].fid];
dirent.d_dev=DEVFCB;
dirent.d_ino=offs;
memcpy(&dirent.d_icon,"dev",3);
......@@ -207,8 +225,8 @@ void devfs_dump()
for(i=0;i<ndev;i++) {
if(dev[i].fid==-1)
continue;
dbg_printf("%3d. pid %02x dev %x mode %2x blk %d",
i,dev[i].drivertask,dev[i].device,fcb[dev[i].fid].mode,fcb[dev[i].fid].device.blksize);
dbg_printf("%3d.(%3d) pid %02x dev %x mode %2x blk %d",
i,devidx[i],dev[i].drivertask,dev[i].device,fcb[dev[i].fid].mode,fcb[dev[i].fid].device.blksize);
dbg_printf(" size %d %d %s\n",fcb[dev[i].fid].device.filesize,dev[i].fid,fcb[dev[i].fid].abspath);
}
}
......
......@@ -43,14 +43,14 @@ typedef struct {
blkcnt_t out; // number of blocks already written out
} devfs_t;
extern uint64_t ndev;
extern uint32_t ndev;
extern devfs_t *dev;
extern void devfs_init();
extern uint64_t devfs_add(char *name, pid_t drivertask, dev_t device, mode_t mode, blksize_t blksize, blkcnt_t blkcnt);
extern void devfs_del(uint64_t idx);
extern void devfs_used(uint64_t idx);
extern uint64_t devfs_lastused(bool_t all);
extern uint32_t devfs_add(char *name, pid_t drivertask, dev_t device, mode_t mode, blksize_t blksize, blkcnt_t blkcnt);
extern void devfs_del(uint32_t idx);
extern void devfs_used(uint32_t idx);
extern uint32_t devfs_lastused(bool_t all);
extern size_t devfs_getdirent(fpos_t offs);
#if DEBUG
......
......@@ -671,6 +671,7 @@ stat_t *statfs(fid_t idx)
// add common fcb fields
st.st_dev=f->reg.storage;
st.st_ino=f->reg.inode;
st.st_nlink=f->nopen;
st.st_mode=(f->mode&S_IMODE);
if(f->type==FCB_TYPE_UNION)
st.st_mode|=S_IFDIR|S_IFUNI;
......
#ifndef _CRC32C__
#define _CRC32C__
//precalculated CRC32c lookup table for polynomial 0x1EDC6F41 (castagnoli-crc)
uint32_t crc32c_lookup[256]={
0x00000000L, 0xF26B8303L, 0xE13B70F7L, 0x1350F3F4L, 0xC79A971FL, 0x35F1141CL, 0x26A1E7E8L, 0xD4CA64EBL,
0x8AD958CFL, 0x78B2DBCCL, 0x6BE22838L, 0x9989AB3BL, 0x4D43CFD0L, 0xBF284CD3L, 0xAC78BF27L, 0x5E133C24L,
0x105EC76FL, 0xE235446CL, 0xF165B798L, 0x030E349BL, 0xD7C45070L, 0x25AFD373L, 0x36FF2087L, 0xC494A384L,
0x9A879FA0L, 0x68EC1CA3L, 0x7BBCEF57L, 0x89D76C54L, 0x5D1D08BFL, 0xAF768BBCL, 0xBC267848L, 0x4E4DFB4BL,
0x20BD8EDEL, 0xD2D60DDDL, 0xC186FE29L, 0x33ED7D2AL, 0xE72719C1L, 0x154C9AC2L, 0x061C6936L, 0xF477EA35L,
0xAA64D611L, 0x580F5512L, 0x4B5FA6E6L, 0xB93425E5L, 0x6DFE410EL, 0x9F95C20DL, 0x8CC531F9L, 0x7EAEB2FAL,
0x30E349B1L, 0xC288CAB2L, 0xD1D83946L, 0x23B3BA45L, 0xF779DEAEL, 0x05125DADL, 0x1642AE59L, 0xE4292D5AL,
0xBA3A117EL, 0x4851927DL, 0x5B016189L, 0xA96AE28AL, 0x7DA08661L, 0x8FCB0562L, 0x9C9BF696L, 0x6EF07595L,
0x417B1DBCL, 0xB3109EBFL, 0xA0406D4BL, 0x522BEE48L, 0x86E18AA3L, 0x748A09A0L, 0x67DAFA54L, 0x95B17957L,
0xCBA24573L, 0x39C9C670L, 0x2A993584L, 0xD8F2B687L, 0x0C38D26CL, 0xFE53516FL, 0xED03A29BL, 0x1F682198L,
0x5125DAD3L, 0xA34E59D0L, 0xB01EAA24L, 0x42752927L, 0x96BF4DCCL, 0x64D4CECFL, 0x77843D3BL, 0x85EFBE38L,
0xDBFC821CL, 0x2997011FL, 0x3AC7F2EBL, 0xC8AC71E8L, 0x1C661503L, 0xEE0D9600L, 0xFD5D65F4L, 0x0F36E6F7L,
0x61C69362L, 0x93AD1061L, 0x80FDE395L, 0x72966096L, 0xA65C047DL, 0x5437877EL, 0x4767748AL, 0xB50CF789L,
0xEB1FCBADL, 0x197448AEL, 0x0A24BB5AL, 0xF84F3859L, 0x2C855CB2L, 0xDEEEDFB1L, 0xCDBE2C45L, 0x3FD5AF46L,
0x7198540DL, 0x83F3D70EL, 0x90A324FAL, 0x62C8A7F9L, 0xB602C312L, 0x44694011L, 0x5739B3E5L, 0xA55230E6L,
0xFB410CC2L, 0x092A8FC1L, 0x1A7A7C35L, 0xE811FF36L, 0x3CDB9BDDL, 0xCEB018DEL, 0xDDE0EB2AL, 0x2F8B6829L,
0x82F63B78L, 0x709DB87BL, 0x63CD4B8FL, 0x91A6C88CL, 0x456CAC67L, 0xB7072F64L, 0xA457DC90L, 0x563C5F93L,
0x082F63B7L, 0xFA44E0B4L, 0xE9141340L, 0x1B7F9043L, 0xCFB5F4A8L, 0x3DDE77ABL, 0x2E8E845FL, 0xDCE5075CL,
0x92A8FC17L, 0x60C37F14L, 0x73938CE0L, 0x81F80FE3L, 0x55326B08L, 0xA759E80BL, 0xB4091BFFL, 0x466298FCL,
0x1871A4D8L, 0xEA1A27DBL, 0xF94AD42FL, 0x0B21572CL, 0xDFEB33C7L, 0x2D80B0C4L, 0x3ED04330L, 0xCCBBC033L,
0xA24BB5A6L, 0x502036A5L, 0x4370C551L, 0xB11B4652L, 0x65D122B9L, 0x97BAA1BAL, 0x84EA524EL, 0x7681D14DL,
0x2892ED69L, 0xDAF96E6AL, 0xC9A99D9EL, 0x3BC21E9DL, 0xEF087A76L, 0x1D63F975L, 0x0E330A81L, 0xFC588982L,
0xB21572C9L, 0x407EF1CAL, 0x532E023EL, 0xA145813DL, 0x758FE5D6L, 0x87E466D5L, 0x94B49521L, 0x66DF1622L,
0x38CC2A06L, 0xCAA7A905L, 0xD9F75AF1L, 0x2B9CD9F2L, 0xFF56BD19L, 0x0D3D3E1AL, 0x1E6DCDEEL, 0xEC064EEDL,
0xC38D26C4L, 0x31E6A5C7L, 0x22B65633L, 0xD0DDD530L, 0x0417B1DBL, 0xF67C32D8L, 0xE52CC12CL, 0x1747422FL,
0x49547E0BL, 0xBB3FFD08L, 0xA86F0EFCL, 0x5A048DFFL, 0x8ECEE914L, 0x7CA56A17L, 0x6FF599E3L, 0x9D9E1AE0L,
0xD3D3E1ABL, 0x21B862A8L, 0x32E8915CL, 0xC083125FL, 0x144976B4L, 0xE622F5B7L, 0xF5720643L, 0x07198540L,
0x590AB964L, 0xAB613A67L, 0xB831C993L, 0x4A5A4A90L, 0x9E902E7BL, 0x6CFBAD78L, 0x7FAB5E8CL, 0x8DC0DD8FL,
0xE330A81AL, 0x115B2B19L, 0x020BD8EDL, 0xF0605BEEL, 0x24AA3F05L, 0xD6C1BC06L, 0xC5914FF2L, 0x37FACCF1L,
0x69E9F0D5L, 0x9B8273D6L, 0x88D28022L, 0x7AB90321L, 0xAE7367CAL, 0x5C18E4C9L, 0x4F48173DL, 0xBD23943EL,
0xF36E6F75L, 0x0105EC76L, 0x12551F82L, 0xE03E9C81L, 0x34F4F86AL, 0xC69F7B69L, 0xD5CF889DL, 0x27A40B9EL,
0x79B737BAL, 0x8BDCB4B9L, 0x988C474DL, 0x6AE7C44EL, 0xBE2DA0A5L, 0x4C4623A6L, 0x5F16D052L, 0xAD7D5351L
};
//precalculated crc lookup table for EFI (ansi-crc)
uint32_t crc32_lookup[256]={
0x00000000,0x77073096,0xee0e612c,0x990951ba,0x076dc419,0x706af48f,0xe963a535,0x9e6495a3,0x0edb8832,
0x79dcb8a4,0xe0d5e91e,0x97d2d988,0x09b64c2b,0x7eb17cbd,0xe7b82d07,0x90bf1d91,0x1db71064,0x6ab020f2,
0xf3b97148,0x84be41de,0x1adad47d,0x6ddde4eb,0xf4d4b551,0x83d385c7,0x136c9856,0x646ba8c0,0xfd62f97a,
0x8a65c9ec,0x14015c4f,0x63066cd9,0xfa0f3d63,0x8d080df5,0x3b6e20c8,0x4c69105e,0xd56041e4,0xa2677172,
0x3c03e4d1,0x4b04d447,0xd20d85fd,0xa50ab56b,0x35b5a8fa,0x42b2986c,0xdbbbc9d6,0xacbcf940,0x32d86ce3,
0x45df5c75,0xdcd60dcf,0xabd13d59,0x26d930ac,0x51de003a,0xc8d75180,0xbfd06116,0x21b4f4b5,0x56b3c423,
0xcfba9599,0xb8bda50f,0x2802b89e,0x5f058808,0xc60cd9b2,0xb10be924,0x2f6f7c87,0x58684c11,0xc1611dab,
0xb6662d3d,0x76dc4190,0x01db7106,0x98d220bc,0xefd5102a,0x71b18589,0x06b6b51f,0x9fbfe4a5,0xe8b8d433,
0x7807c9a2,0x0f00f934,0x9609a88e,0xe10e9818,0x7f6a0dbb,0x086d3d2d,0x91646c97,0xe6635c01,0x6b6b51f4,
0x1c6c6162,0x856530d8,0xf262004e,0x6c0695ed,0x1b01a57b,0x8208f4c1,0xf50fc457,0x65b0d9c6,0x12b7e950,
0x8bbeb8ea,0xfcb9887c,0x62dd1ddf,0x15da2d49,0x8cd37cf3,0xfbd44c65,0x4db26158,0x3ab551ce,0xa3bc0074,
0xd4bb30e2,0x4adfa541,0x3dd895d7,0xa4d1c46d,0xd3d6f4fb,0x4369e96a,0x346ed9fc,0xad678846,0xda60b8d0,
0x44042d73,0x33031de5,0xaa0a4c5f,0xdd0d7cc9,0x5005713c,0x270241aa,0xbe0b1010,0xc90c2086,0x5768b525,
0x206f85b3,0xb966d409,0xce61e49f,0x5edef90e,0x29d9c998,0xb0d09822,0xc7d7a8b4,0x59b33d17,0x2eb40d81,
0xb7bd5c3b,0xc0ba6cad,0xedb88320,0x9abfb3b6,0x03b6e20c,0x74b1d29a,0xead54739,0x9dd277af,0x04db2615,
0x73dc1683,0xe3630b12,0x94643b84,0x0d6d6a3e,0x7a6a5aa8,0xe40ecf0b,0x9309ff9d,0x0a00ae27,0x7d079eb1,
0xf00f9344,0x8708a3d2,0x1e01f268,0x6906c2fe,0xf762575d,0x806567cb,0x196c3671,0x6e6b06e7,0xfed41b76,
0x89d32be0,0x10da7a5a,0x67dd4acc,0xf9b9df6f,0x8ebeeff9,0x17b7be43,0x60b08ed5,0xd6d6a3e8,0xa1d1937e,
0x38d8c2c4,0x4fdff252,0xd1bb67f1,0xa6bc5767,0x3fb506dd,0x48b2364b,0xd80d2bda,0xaf0a1b4c,0x36034af6,
0x41047a60,0xdf60efc3,0xa867df55,0x316e8eef,0x4669be79,0xcb61b38c,0xbc66831a,0x256fd2a0,0x5268e236,
0xcc0c7795,0xbb0b4703,0x220216b9,0x5505262f,0xc5ba3bbe,0xb2bd0b28,0x2bb45a92,0x5cb36a04,0xc2d7ffa7,
0xb5d0cf31,0x2cd99e8b,0x5bdeae1d,0x9b64c2b0,0xec63f226,0x756aa39c,0x026d930a,0x9c0906a9,0xeb0e363f,
0x72076785,0x05005713,0x95bf4a82,0xe2b87a14,0x7bb12bae,0x0cb61b38,0x92d28e9b,0xe5d5be0d,0x7cdcefb7,
0x0bdbdf21,0x86d3d2d4,0xf1d4e242,0x68ddb3f8,0x1fda836e,0x81be16cd,0xf6b9265b,0x6fb077e1,0x18b74777,
0x88085ae6,0xff0f6a70,0x66063bca,0x11010b5c,0x8f659eff,0xf862ae69,0x616bffd3,0x166ccf45,0xa00ae278,
0xd70dd2ee,0x4e048354,0x3903b3c2,0xa7672661,0xd06016f7,0x4969474d,0x3e6e77db,0xaed16a4a,0xd9d65adc,
0x40df0b66,0x37d83bf0,0xa9bcae53,0xdebb9ec5,0x47b2cf7f,0x30b5ffe9,0xbdbdf21c,0xcabac28a,0x53b39330,
0x24b4a3a6,0xbad03605,0xcdd70693,0x54de5729,0x23d967bf,0xb3667a2e,0xc4614ab8,0x5d681b02,0x2a6f2b94,
0xb40bbe37,0xc30c8ea1,0x5a05df1b,0x2d02ef8d};
//calculate CRC32c checksum
uint32_t crc32_calc(char *start,int length)
{
uint32_t crc32_val=0;
while(length--) crc32_val=(crc32_val>>8)^crc32c_lookup[(crc32_val&0xff)^(unsigned char)*start++];
return crc32_val;
}
//calculate EFI compatible crc
uint32_t eficrc32_calc(char *start,int length)
{
//init
uint32_t crc32_val=0xffffffff;
//calculate
while(length--) crc32_val=(crc32_val>>8)^crc32_lookup[(crc32_val&0xff)^(unsigned char)*start++];
//finalize
crc32_val^=0xffffffff;
return crc32_val;
}
#endif /* crc32.h */
......@@ -25,6 +25,7 @@
* @brief Function implementations for stdlib.h
*/
#include <osZ.h>
#include "crc32.h"
/* filled in by the run-time linker */
public char _osver[256];
......@@ -62,10 +63,8 @@ int lang_init(char *prefix, int txtc, char **txt)
s=malloc(st->st_size);
if(s) {
fread(f, s, st->st_size);
// we don't do crc check, because if stdlib would include crc32.h, that would
// cause name conflict with applications that also include it. Also, it's an
// extra 4k code with the lookup table.
if(memcmp(s,"LANG",4) || *(uint32_t*)(s+12)!=txtc) return 0;
if(memcmp(s,"LANG",4) || *(uint32_t*)(s+12)!=txtc ||
*(uint32_t*)(s+8)!=crc32_calc(s+16,*(uint32_t*)(s+4)-16)) return 0;
s+=16;
while(i<txtc) {
txt[i++]=s;
......
......@@ -45,7 +45,7 @@
#include <zlib.h>
#endif
#include "../etc/include/sys/fsZ.h"
#include "../etc/include/crc32.h"
#include "../src/libc/crc32.h"
//-------------DATA-----------
char *diskname; //entire disk
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment