forked from KolibriOS/kolibrios
[KERNEL][TEST] Remove UMKa from the main repo for now
git-svn-id: svn://kolibrios.org@9387 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
73b43d8ec6
commit
2a56bcb027
@ -16,8 +16,6 @@ import filecmp
|
|||||||
sys.path.append('test')
|
sys.path.append('test')
|
||||||
import common
|
import common
|
||||||
|
|
||||||
enable_umka = True
|
|
||||||
|
|
||||||
def log(s, end = "\n"):
|
def log(s, end = "\n"):
|
||||||
print(s, end = end, flush = True)
|
print(s, end = end, flush = True)
|
||||||
|
|
||||||
@ -134,18 +132,6 @@ def collect_tests():
|
|||||||
tests.append(test_folder_path)
|
tests.append(test_folder_path)
|
||||||
return tests
|
return tests
|
||||||
|
|
||||||
def collect_umka_tests():
|
|
||||||
tests = []
|
|
||||||
|
|
||||||
for test_file in os.listdir("umka/test"):
|
|
||||||
test_file_path = f"umka/test/{test_file}"
|
|
||||||
if not test_file.endswith(".t"):
|
|
||||||
continue
|
|
||||||
if not os.path.isfile(test_file_path):
|
|
||||||
continue
|
|
||||||
tests.append(test_file_path)
|
|
||||||
return tests
|
|
||||||
|
|
||||||
def run_tests_serially_thread(test, root_dir):
|
def run_tests_serially_thread(test, root_dir):
|
||||||
test_number = 1
|
test_number = 1
|
||||||
for test in tests:
|
for test in tests:
|
||||||
@ -171,95 +157,6 @@ def run_tests_serially(tests, root_dir):
|
|||||||
thread.start()
|
thread.start()
|
||||||
return thread
|
return thread
|
||||||
|
|
||||||
def gcc(fin, fout):
|
|
||||||
flags = "-m32 -std=c11 -g -O0 -fno-pie -w"
|
|
||||||
defines = "-D_FILE_OFFSET_BITS=64 -DNDEBUG -D_POSIX_C_SOURCE=200809L"
|
|
||||||
include = "-Iumka -Iumka/linux"
|
|
||||||
command = f"clang {flags} {defines} {include} -c {fin} -o {fout}"
|
|
||||||
print(command)
|
|
||||||
os.system(command)
|
|
||||||
|
|
||||||
def build_umka_asm():
|
|
||||||
include = "INCLUDE=\"../../programs/develop/libraries/libcrash/hash\""
|
|
||||||
flags = "-dUEFI=1 -dextended_primary_loader=1 -dUMKA=1"
|
|
||||||
files = "umka/umka.asm umka/build/umka.o -s umka/build/umka.fas"
|
|
||||||
memory = "-m 2000000"
|
|
||||||
command = f"{include} fasm {flags} {files} {memory}"
|
|
||||||
if sys.platform != "win32":
|
|
||||||
print(command)
|
|
||||||
os.system(command)
|
|
||||||
else:
|
|
||||||
my_env = os.environ.copy()
|
|
||||||
my_env["INCLUDE"] = "../../programs/develop/libraries/libcrash/hash"
|
|
||||||
print(subprocess.check_output(f"fasm {flags} {files} {memory} -dwin32=1", shell = True, env = my_env))
|
|
||||||
|
|
||||||
def build_umka():
|
|
||||||
if not enable_umka:
|
|
||||||
return
|
|
||||||
if os.path.exists("umka_shell.exe"):
|
|
||||||
return
|
|
||||||
os.makedirs("umka/build/linux", exist_ok = True)
|
|
||||||
os.makedirs("umka/build/win32", exist_ok = True)
|
|
||||||
sources = [ "umka_shell.c",
|
|
||||||
"shell.c",
|
|
||||||
"vdisk.c",
|
|
||||||
"lodepng.c",
|
|
||||||
"getopt.c" ]
|
|
||||||
if sys.platform == "win32":
|
|
||||||
sources += [ "win32/pci.c", "win32/thread.c" ]
|
|
||||||
else:
|
|
||||||
sources += [ "linux/pci.c", "linux/thread.c" ]
|
|
||||||
sources = [f"umka/{f}" for f in sources]
|
|
||||||
objects = []
|
|
||||||
for source in sources:
|
|
||||||
object_path = source.replace("umka/", "umka/build/")
|
|
||||||
object_path = f"{object_path}.o"
|
|
||||||
gcc(source, object_path)
|
|
||||||
objects.append(object_path)
|
|
||||||
build_umka_asm()
|
|
||||||
objects.append("umka/build/umka.o")
|
|
||||||
objects = " ".join(objects)
|
|
||||||
if sys.platform != "win32":
|
|
||||||
ld_script = "-T umka/umka.ld"
|
|
||||||
else:
|
|
||||||
ld_script = ""
|
|
||||||
command = f"clang -m32 -fno-pie -o umka_shell.exe -static {ld_script} {objects}"
|
|
||||||
print(command)
|
|
||||||
os.system(command)
|
|
||||||
if not os.path.exists("umka_shell.exe"):
|
|
||||||
print("Could't compile umka_shell.exe")
|
|
||||||
exit()
|
|
||||||
|
|
||||||
def create_relocated(root_dir, fname):
|
|
||||||
with open(fname, "rb") as f:
|
|
||||||
contents = f.read()
|
|
||||||
new_contents = contents.replace(b"../img", bytes(f"{root_dir}/umka/img", "ascii"))
|
|
||||||
new_contents = new_contents.replace(b"chess_image.rgb", bytes(f"{root_dir}/umka/test/chess_image.rgb", "ascii"))
|
|
||||||
outname = f"{fname}.o" # .o extension just to avoid indexing of the file
|
|
||||||
with open(outname, "wb") as f:
|
|
||||||
f.write(new_contents)
|
|
||||||
return outname
|
|
||||||
|
|
||||||
def run_umka_test(root_dir, test_file_path):
|
|
||||||
test = create_relocated(root_dir, test_file_path)
|
|
||||||
ref_log = create_relocated(root_dir, f"{test_file_path[:-2]}.ref.log")
|
|
||||||
out_log = f"{test_file_path[:-2]}.out.log"
|
|
||||||
if sys.platform != "win32":
|
|
||||||
prefix = "./"
|
|
||||||
else:
|
|
||||||
prefix = ""
|
|
||||||
os.system(f"{prefix}umka_shell.exe < {test} > {out_log}")
|
|
||||||
if sys.platform == "win32":
|
|
||||||
with open(out_log, "rb") as f:
|
|
||||||
contents = f.read()
|
|
||||||
contents_no_crlf = contents.replace(b"\r\n", b"\n")
|
|
||||||
with open(out_log, "wb") as f:
|
|
||||||
f.write(contents_no_crlf)
|
|
||||||
if not filecmp.cmp(ref_log, out_log):
|
|
||||||
print(f"FAILURE: {test_file_path}\n", end = "")
|
|
||||||
else:
|
|
||||||
print(f"SUCCESS: {test_file_path}\n", end = "")
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
root_dir = os.getcwd()
|
root_dir = os.getcwd()
|
||||||
|
|
||||||
@ -269,12 +166,7 @@ if __name__ == "__main__":
|
|||||||
check_tools(tools)
|
check_tools(tools)
|
||||||
|
|
||||||
prepare_test_img()
|
prepare_test_img()
|
||||||
build_umka()
|
|
||||||
tests = collect_tests()
|
tests = collect_tests()
|
||||||
umka_tests = collect_umka_tests()
|
|
||||||
serial_executor_thread = run_tests_serially(tests, root_dir)
|
serial_executor_thread = run_tests_serially(tests, root_dir)
|
||||||
if enable_umka:
|
|
||||||
for umka_test in umka_tests:
|
|
||||||
run_umka_test(root_dir, umka_test)
|
|
||||||
serial_executor_thread.join()
|
serial_executor_thread.join()
|
||||||
|
|
||||||
|
@ -1,339 +0,0 @@
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
Version 2, June 1991
|
|
||||||
|
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
Preamble
|
|
||||||
|
|
||||||
The licenses for most software are designed to take away your
|
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
|
||||||
License is intended to guarantee your freedom to share and change free
|
|
||||||
software--to make sure the software is free for all its users. This
|
|
||||||
General Public License applies to most of the Free Software
|
|
||||||
Foundation's software and to any other program whose authors commit to
|
|
||||||
using it. (Some other Free Software Foundation software is covered by
|
|
||||||
the GNU Lesser General Public License instead.) You can apply it to
|
|
||||||
your programs, too.
|
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
|
||||||
price. Our General Public Licenses are designed to make sure that you
|
|
||||||
have the freedom to distribute copies of free software (and charge for
|
|
||||||
this service if you wish), that you receive source code or can get it
|
|
||||||
if you want it, that you can change the software or use pieces of it
|
|
||||||
in new free programs; and that you know you can do these things.
|
|
||||||
|
|
||||||
To protect your rights, we need to make restrictions that forbid
|
|
||||||
anyone to deny you these rights or to ask you to surrender the rights.
|
|
||||||
These restrictions translate to certain responsibilities for you if you
|
|
||||||
distribute copies of the software, or if you modify it.
|
|
||||||
|
|
||||||
For example, if you distribute copies of such a program, whether
|
|
||||||
gratis or for a fee, you must give the recipients all the rights that
|
|
||||||
you have. You must make sure that they, too, receive or can get the
|
|
||||||
source code. And you must show them these terms so they know their
|
|
||||||
rights.
|
|
||||||
|
|
||||||
We protect your rights with two steps: (1) copyright the software, and
|
|
||||||
(2) offer you this license which gives you legal permission to copy,
|
|
||||||
distribute and/or modify the software.
|
|
||||||
|
|
||||||
Also, for each author's protection and ours, we want to make certain
|
|
||||||
that everyone understands that there is no warranty for this free
|
|
||||||
software. If the software is modified by someone else and passed on, we
|
|
||||||
want its recipients to know that what they have is not the original, so
|
|
||||||
that any problems introduced by others will not reflect on the original
|
|
||||||
authors' reputations.
|
|
||||||
|
|
||||||
Finally, any free program is threatened constantly by software
|
|
||||||
patents. We wish to avoid the danger that redistributors of a free
|
|
||||||
program will individually obtain patent licenses, in effect making the
|
|
||||||
program proprietary. To prevent this, we have made it clear that any
|
|
||||||
patent must be licensed for everyone's free use or not licensed at all.
|
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
|
||||||
modification follow.
|
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
|
||||||
|
|
||||||
0. This License applies to any program or other work which contains
|
|
||||||
a notice placed by the copyright holder saying it may be distributed
|
|
||||||
under the terms of this General Public License. The "Program", below,
|
|
||||||
refers to any such program or work, and a "work based on the Program"
|
|
||||||
means either the Program or any derivative work under copyright law:
|
|
||||||
that is to say, a work containing the Program or a portion of it,
|
|
||||||
either verbatim or with modifications and/or translated into another
|
|
||||||
language. (Hereinafter, translation is included without limitation in
|
|
||||||
the term "modification".) Each licensee is addressed as "you".
|
|
||||||
|
|
||||||
Activities other than copying, distribution and modification are not
|
|
||||||
covered by this License; they are outside its scope. The act of
|
|
||||||
running the Program is not restricted, and the output from the Program
|
|
||||||
is covered only if its contents constitute a work based on the
|
|
||||||
Program (independent of having been made by running the Program).
|
|
||||||
Whether that is true depends on what the Program does.
|
|
||||||
|
|
||||||
1. You may copy and distribute verbatim copies of the Program's
|
|
||||||
source code as you receive it, in any medium, provided that you
|
|
||||||
conspicuously and appropriately publish on each copy an appropriate
|
|
||||||
copyright notice and disclaimer of warranty; keep intact all the
|
|
||||||
notices that refer to this License and to the absence of any warranty;
|
|
||||||
and give any other recipients of the Program a copy of this License
|
|
||||||
along with the Program.
|
|
||||||
|
|
||||||
You may charge a fee for the physical act of transferring a copy, and
|
|
||||||
you may at your option offer warranty protection in exchange for a fee.
|
|
||||||
|
|
||||||
2. You may modify your copy or copies of the Program or any portion
|
|
||||||
of it, thus forming a work based on the Program, and copy and
|
|
||||||
distribute such modifications or work under the terms of Section 1
|
|
||||||
above, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) You must cause the modified files to carry prominent notices
|
|
||||||
stating that you changed the files and the date of any change.
|
|
||||||
|
|
||||||
b) You must cause any work that you distribute or publish, that in
|
|
||||||
whole or in part contains or is derived from the Program or any
|
|
||||||
part thereof, to be licensed as a whole at no charge to all third
|
|
||||||
parties under the terms of this License.
|
|
||||||
|
|
||||||
c) If the modified program normally reads commands interactively
|
|
||||||
when run, you must cause it, when started running for such
|
|
||||||
interactive use in the most ordinary way, to print or display an
|
|
||||||
announcement including an appropriate copyright notice and a
|
|
||||||
notice that there is no warranty (or else, saying that you provide
|
|
||||||
a warranty) and that users may redistribute the program under
|
|
||||||
these conditions, and telling the user how to view a copy of this
|
|
||||||
License. (Exception: if the Program itself is interactive but
|
|
||||||
does not normally print such an announcement, your work based on
|
|
||||||
the Program is not required to print an announcement.)
|
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
|
||||||
identifiable sections of that work are not derived from the Program,
|
|
||||||
and can be reasonably considered independent and separate works in
|
|
||||||
themselves, then this License, and its terms, do not apply to those
|
|
||||||
sections when you distribute them as separate works. But when you
|
|
||||||
distribute the same sections as part of a whole which is a work based
|
|
||||||
on the Program, the distribution of the whole must be on the terms of
|
|
||||||
this License, whose permissions for other licensees extend to the
|
|
||||||
entire whole, and thus to each and every part regardless of who wrote it.
|
|
||||||
|
|
||||||
Thus, it is not the intent of this section to claim rights or contest
|
|
||||||
your rights to work written entirely by you; rather, the intent is to
|
|
||||||
exercise the right to control the distribution of derivative or
|
|
||||||
collective works based on the Program.
|
|
||||||
|
|
||||||
In addition, mere aggregation of another work not based on the Program
|
|
||||||
with the Program (or with a work based on the Program) on a volume of
|
|
||||||
a storage or distribution medium does not bring the other work under
|
|
||||||
the scope of this License.
|
|
||||||
|
|
||||||
3. You may copy and distribute the Program (or a work based on it,
|
|
||||||
under Section 2) in object code or executable form under the terms of
|
|
||||||
Sections 1 and 2 above provided that you also do one of the following:
|
|
||||||
|
|
||||||
a) Accompany it with the complete corresponding machine-readable
|
|
||||||
source code, which must be distributed under the terms of Sections
|
|
||||||
1 and 2 above on a medium customarily used for software interchange; or,
|
|
||||||
|
|
||||||
b) Accompany it with a written offer, valid for at least three
|
|
||||||
years, to give any third party, for a charge no more than your
|
|
||||||
cost of physically performing source distribution, a complete
|
|
||||||
machine-readable copy of the corresponding source code, to be
|
|
||||||
distributed under the terms of Sections 1 and 2 above on a medium
|
|
||||||
customarily used for software interchange; or,
|
|
||||||
|
|
||||||
c) Accompany it with the information you received as to the offer
|
|
||||||
to distribute corresponding source code. (This alternative is
|
|
||||||
allowed only for noncommercial distribution and only if you
|
|
||||||
received the program in object code or executable form with such
|
|
||||||
an offer, in accord with Subsection b above.)
|
|
||||||
|
|
||||||
The source code for a work means the preferred form of the work for
|
|
||||||
making modifications to it. For an executable work, complete source
|
|
||||||
code means all the source code for all modules it contains, plus any
|
|
||||||
associated interface definition files, plus the scripts used to
|
|
||||||
control compilation and installation of the executable. However, as a
|
|
||||||
special exception, the source code distributed need not include
|
|
||||||
anything that is normally distributed (in either source or binary
|
|
||||||
form) with the major components (compiler, kernel, and so on) of the
|
|
||||||
operating system on which the executable runs, unless that component
|
|
||||||
itself accompanies the executable.
|
|
||||||
|
|
||||||
If distribution of executable or object code is made by offering
|
|
||||||
access to copy from a designated place, then offering equivalent
|
|
||||||
access to copy the source code from the same place counts as
|
|
||||||
distribution of the source code, even though third parties are not
|
|
||||||
compelled to copy the source along with the object code.
|
|
||||||
|
|
||||||
4. You may not copy, modify, sublicense, or distribute the Program
|
|
||||||
except as expressly provided under this License. Any attempt
|
|
||||||
otherwise to copy, modify, sublicense or distribute the Program is
|
|
||||||
void, and will automatically terminate your rights under this License.
|
|
||||||
However, parties who have received copies, or rights, from you under
|
|
||||||
this License will not have their licenses terminated so long as such
|
|
||||||
parties remain in full compliance.
|
|
||||||
|
|
||||||
5. You are not required to accept this License, since you have not
|
|
||||||
signed it. However, nothing else grants you permission to modify or
|
|
||||||
distribute the Program or its derivative works. These actions are
|
|
||||||
prohibited by law if you do not accept this License. Therefore, by
|
|
||||||
modifying or distributing the Program (or any work based on the
|
|
||||||
Program), you indicate your acceptance of this License to do so, and
|
|
||||||
all its terms and conditions for copying, distributing or modifying
|
|
||||||
the Program or works based on it.
|
|
||||||
|
|
||||||
6. Each time you redistribute the Program (or any work based on the
|
|
||||||
Program), the recipient automatically receives a license from the
|
|
||||||
original licensor to copy, distribute or modify the Program subject to
|
|
||||||
these terms and conditions. You may not impose any further
|
|
||||||
restrictions on the recipients' exercise of the rights granted herein.
|
|
||||||
You are not responsible for enforcing compliance by third parties to
|
|
||||||
this License.
|
|
||||||
|
|
||||||
7. If, as a consequence of a court judgment or allegation of patent
|
|
||||||
infringement or for any other reason (not limited to patent issues),
|
|
||||||
conditions are imposed on you (whether by court order, agreement or
|
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
|
||||||
excuse you from the conditions of this License. If you cannot
|
|
||||||
distribute so as to satisfy simultaneously your obligations under this
|
|
||||||
License and any other pertinent obligations, then as a consequence you
|
|
||||||
may not distribute the Program at all. For example, if a patent
|
|
||||||
license would not permit royalty-free redistribution of the Program by
|
|
||||||
all those who receive copies directly or indirectly through you, then
|
|
||||||
the only way you could satisfy both it and this License would be to
|
|
||||||
refrain entirely from distribution of the Program.
|
|
||||||
|
|
||||||
If any portion of this section is held invalid or unenforceable under
|
|
||||||
any particular circumstance, the balance of the section is intended to
|
|
||||||
apply and the section as a whole is intended to apply in other
|
|
||||||
circumstances.
|
|
||||||
|
|
||||||
It is not the purpose of this section to induce you to infringe any
|
|
||||||
patents or other property right claims or to contest validity of any
|
|
||||||
such claims; this section has the sole purpose of protecting the
|
|
||||||
integrity of the free software distribution system, which is
|
|
||||||
implemented by public license practices. Many people have made
|
|
||||||
generous contributions to the wide range of software distributed
|
|
||||||
through that system in reliance on consistent application of that
|
|
||||||
system; it is up to the author/donor to decide if he or she is willing
|
|
||||||
to distribute software through any other system and a licensee cannot
|
|
||||||
impose that choice.
|
|
||||||
|
|
||||||
This section is intended to make thoroughly clear what is believed to
|
|
||||||
be a consequence of the rest of this License.
|
|
||||||
|
|
||||||
8. If the distribution and/or use of the Program is restricted in
|
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
|
||||||
original copyright holder who places the Program under this License
|
|
||||||
may add an explicit geographical distribution limitation excluding
|
|
||||||
those countries, so that distribution is permitted only in or among
|
|
||||||
countries not thus excluded. In such case, this License incorporates
|
|
||||||
the limitation as if written in the body of this License.
|
|
||||||
|
|
||||||
9. The Free Software Foundation may publish revised and/or new versions
|
|
||||||
of the General Public License from time to time. Such new versions will
|
|
||||||
be similar in spirit to the present version, but may differ in detail to
|
|
||||||
address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the Program
|
|
||||||
specifies a version number of this License which applies to it and "any
|
|
||||||
later version", you have the option of following the terms and conditions
|
|
||||||
either of that version or of any later version published by the Free
|
|
||||||
Software Foundation. If the Program does not specify a version number of
|
|
||||||
this License, you may choose any version ever published by the Free Software
|
|
||||||
Foundation.
|
|
||||||
|
|
||||||
10. If you wish to incorporate parts of the Program into other free
|
|
||||||
programs whose distribution conditions are different, write to the author
|
|
||||||
to ask for permission. For software which is copyrighted by the Free
|
|
||||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
|
||||||
make exceptions for this. Our decision will be guided by the two goals
|
|
||||||
of preserving the free status of all derivatives of our free software and
|
|
||||||
of promoting the sharing and reuse of software generally.
|
|
||||||
|
|
||||||
NO WARRANTY
|
|
||||||
|
|
||||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
|
||||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
|
||||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
|
||||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
|
||||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
|
||||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
|
||||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
|
||||||
REPAIR OR CORRECTION.
|
|
||||||
|
|
||||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
|
||||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
|
||||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
|
||||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
|
||||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
|
||||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
|
||||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGES.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
|
||||||
possible use to the public, the best way to achieve this is to make it
|
|
||||||
free software which everyone can redistribute and change under these terms.
|
|
||||||
|
|
||||||
To do so, attach the following notices to the program. It is safest
|
|
||||||
to attach them to the start of each source file to most effectively
|
|
||||||
convey the exclusion of warranty; and each file should have at least
|
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
|
||||||
|
|
||||||
<one line to give the program's name and a brief idea of what it does.>
|
|
||||||
Copyright (C) <year> <name of author>
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
If the program is interactive, make it output a short notice like this
|
|
||||||
when it starts in an interactive mode:
|
|
||||||
|
|
||||||
Gnomovision version 69, Copyright (C) year name of author
|
|
||||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
|
||||||
This is free software, and you are welcome to redistribute it
|
|
||||||
under certain conditions; type `show c' for details.
|
|
||||||
|
|
||||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
|
||||||
parts of the General Public License. Of course, the commands you use may
|
|
||||||
be called something other than `show w' and `show c'; they could even be
|
|
||||||
mouse-clicks or menu items--whatever suits your program.
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or your
|
|
||||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
|
||||||
necessary. Here is a sample; alter the names:
|
|
||||||
|
|
||||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
|
||||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
|
||||||
|
|
||||||
<signature of Ty Coon>, 1 April 1989
|
|
||||||
Ty Coon, President of Vice
|
|
||||||
|
|
||||||
This General Public License does not permit incorporating your program into
|
|
||||||
proprietary programs. If your program is a subroutine library, you may
|
|
||||||
consider it more useful to permit linking proprietary applications with the
|
|
||||||
library. If this is what you want to do, use the GNU Lesser General
|
|
||||||
Public License instead of this License.
|
|
@ -1,674 +0,0 @@
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
Version 3, 29 June 2007
|
|
||||||
|
|
||||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
Preamble
|
|
||||||
|
|
||||||
The GNU General Public License is a free, copyleft license for
|
|
||||||
software and other kinds of works.
|
|
||||||
|
|
||||||
The licenses for most software and other practical works are designed
|
|
||||||
to take away your freedom to share and change the works. By contrast,
|
|
||||||
the GNU General Public License is intended to guarantee your freedom to
|
|
||||||
share and change all versions of a program--to make sure it remains free
|
|
||||||
software for all its users. We, the Free Software Foundation, use the
|
|
||||||
GNU General Public License for most of our software; it applies also to
|
|
||||||
any other work released this way by its authors. You can apply it to
|
|
||||||
your programs, too.
|
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
|
||||||
price. Our General Public Licenses are designed to make sure that you
|
|
||||||
have the freedom to distribute copies of free software (and charge for
|
|
||||||
them if you wish), that you receive source code or can get it if you
|
|
||||||
want it, that you can change the software or use pieces of it in new
|
|
||||||
free programs, and that you know you can do these things.
|
|
||||||
|
|
||||||
To protect your rights, we need to prevent others from denying you
|
|
||||||
these rights or asking you to surrender the rights. Therefore, you have
|
|
||||||
certain responsibilities if you distribute copies of the software, or if
|
|
||||||
you modify it: responsibilities to respect the freedom of others.
|
|
||||||
|
|
||||||
For example, if you distribute copies of such a program, whether
|
|
||||||
gratis or for a fee, you must pass on to the recipients the same
|
|
||||||
freedoms that you received. You must make sure that they, too, receive
|
|
||||||
or can get the source code. And you must show them these terms so they
|
|
||||||
know their rights.
|
|
||||||
|
|
||||||
Developers that use the GNU GPL protect your rights with two steps:
|
|
||||||
(1) assert copyright on the software, and (2) offer you this License
|
|
||||||
giving you legal permission to copy, distribute and/or modify it.
|
|
||||||
|
|
||||||
For the developers' and authors' protection, the GPL clearly explains
|
|
||||||
that there is no warranty for this free software. For both users' and
|
|
||||||
authors' sake, the GPL requires that modified versions be marked as
|
|
||||||
changed, so that their problems will not be attributed erroneously to
|
|
||||||
authors of previous versions.
|
|
||||||
|
|
||||||
Some devices are designed to deny users access to install or run
|
|
||||||
modified versions of the software inside them, although the manufacturer
|
|
||||||
can do so. This is fundamentally incompatible with the aim of
|
|
||||||
protecting users' freedom to change the software. The systematic
|
|
||||||
pattern of such abuse occurs in the area of products for individuals to
|
|
||||||
use, which is precisely where it is most unacceptable. Therefore, we
|
|
||||||
have designed this version of the GPL to prohibit the practice for those
|
|
||||||
products. If such problems arise substantially in other domains, we
|
|
||||||
stand ready to extend this provision to those domains in future versions
|
|
||||||
of the GPL, as needed to protect the freedom of users.
|
|
||||||
|
|
||||||
Finally, every program is threatened constantly by software patents.
|
|
||||||
States should not allow patents to restrict development and use of
|
|
||||||
software on general-purpose computers, but in those that do, we wish to
|
|
||||||
avoid the special danger that patents applied to a free program could
|
|
||||||
make it effectively proprietary. To prevent this, the GPL assures that
|
|
||||||
patents cannot be used to render the program non-free.
|
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
|
||||||
modification follow.
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
0. Definitions.
|
|
||||||
|
|
||||||
"This License" refers to version 3 of the GNU General Public License.
|
|
||||||
|
|
||||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
|
||||||
works, such as semiconductor masks.
|
|
||||||
|
|
||||||
"The Program" refers to any copyrightable work licensed under this
|
|
||||||
License. Each licensee is addressed as "you". "Licensees" and
|
|
||||||
"recipients" may be individuals or organizations.
|
|
||||||
|
|
||||||
To "modify" a work means to copy from or adapt all or part of the work
|
|
||||||
in a fashion requiring copyright permission, other than the making of an
|
|
||||||
exact copy. The resulting work is called a "modified version" of the
|
|
||||||
earlier work or a work "based on" the earlier work.
|
|
||||||
|
|
||||||
A "covered work" means either the unmodified Program or a work based
|
|
||||||
on the Program.
|
|
||||||
|
|
||||||
To "propagate" a work means to do anything with it that, without
|
|
||||||
permission, would make you directly or secondarily liable for
|
|
||||||
infringement under applicable copyright law, except executing it on a
|
|
||||||
computer or modifying a private copy. Propagation includes copying,
|
|
||||||
distribution (with or without modification), making available to the
|
|
||||||
public, and in some countries other activities as well.
|
|
||||||
|
|
||||||
To "convey" a work means any kind of propagation that enables other
|
|
||||||
parties to make or receive copies. Mere interaction with a user through
|
|
||||||
a computer network, with no transfer of a copy, is not conveying.
|
|
||||||
|
|
||||||
An interactive user interface displays "Appropriate Legal Notices"
|
|
||||||
to the extent that it includes a convenient and prominently visible
|
|
||||||
feature that (1) displays an appropriate copyright notice, and (2)
|
|
||||||
tells the user that there is no warranty for the work (except to the
|
|
||||||
extent that warranties are provided), that licensees may convey the
|
|
||||||
work under this License, and how to view a copy of this License. If
|
|
||||||
the interface presents a list of user commands or options, such as a
|
|
||||||
menu, a prominent item in the list meets this criterion.
|
|
||||||
|
|
||||||
1. Source Code.
|
|
||||||
|
|
||||||
The "source code" for a work means the preferred form of the work
|
|
||||||
for making modifications to it. "Object code" means any non-source
|
|
||||||
form of a work.
|
|
||||||
|
|
||||||
A "Standard Interface" means an interface that either is an official
|
|
||||||
standard defined by a recognized standards body, or, in the case of
|
|
||||||
interfaces specified for a particular programming language, one that
|
|
||||||
is widely used among developers working in that language.
|
|
||||||
|
|
||||||
The "System Libraries" of an executable work include anything, other
|
|
||||||
than the work as a whole, that (a) is included in the normal form of
|
|
||||||
packaging a Major Component, but which is not part of that Major
|
|
||||||
Component, and (b) serves only to enable use of the work with that
|
|
||||||
Major Component, or to implement a Standard Interface for which an
|
|
||||||
implementation is available to the public in source code form. A
|
|
||||||
"Major Component", in this context, means a major essential component
|
|
||||||
(kernel, window system, and so on) of the specific operating system
|
|
||||||
(if any) on which the executable work runs, or a compiler used to
|
|
||||||
produce the work, or an object code interpreter used to run it.
|
|
||||||
|
|
||||||
The "Corresponding Source" for a work in object code form means all
|
|
||||||
the source code needed to generate, install, and (for an executable
|
|
||||||
work) run the object code and to modify the work, including scripts to
|
|
||||||
control those activities. However, it does not include the work's
|
|
||||||
System Libraries, or general-purpose tools or generally available free
|
|
||||||
programs which are used unmodified in performing those activities but
|
|
||||||
which are not part of the work. For example, Corresponding Source
|
|
||||||
includes interface definition files associated with source files for
|
|
||||||
the work, and the source code for shared libraries and dynamically
|
|
||||||
linked subprograms that the work is specifically designed to require,
|
|
||||||
such as by intimate data communication or control flow between those
|
|
||||||
subprograms and other parts of the work.
|
|
||||||
|
|
||||||
The Corresponding Source need not include anything that users
|
|
||||||
can regenerate automatically from other parts of the Corresponding
|
|
||||||
Source.
|
|
||||||
|
|
||||||
The Corresponding Source for a work in source code form is that
|
|
||||||
same work.
|
|
||||||
|
|
||||||
2. Basic Permissions.
|
|
||||||
|
|
||||||
All rights granted under this License are granted for the term of
|
|
||||||
copyright on the Program, and are irrevocable provided the stated
|
|
||||||
conditions are met. This License explicitly affirms your unlimited
|
|
||||||
permission to run the unmodified Program. The output from running a
|
|
||||||
covered work is covered by this License only if the output, given its
|
|
||||||
content, constitutes a covered work. This License acknowledges your
|
|
||||||
rights of fair use or other equivalent, as provided by copyright law.
|
|
||||||
|
|
||||||
You may make, run and propagate covered works that you do not
|
|
||||||
convey, without conditions so long as your license otherwise remains
|
|
||||||
in force. You may convey covered works to others for the sole purpose
|
|
||||||
of having them make modifications exclusively for you, or provide you
|
|
||||||
with facilities for running those works, provided that you comply with
|
|
||||||
the terms of this License in conveying all material for which you do
|
|
||||||
not control copyright. Those thus making or running the covered works
|
|
||||||
for you must do so exclusively on your behalf, under your direction
|
|
||||||
and control, on terms that prohibit them from making any copies of
|
|
||||||
your copyrighted material outside their relationship with you.
|
|
||||||
|
|
||||||
Conveying under any other circumstances is permitted solely under
|
|
||||||
the conditions stated below. Sublicensing is not allowed; section 10
|
|
||||||
makes it unnecessary.
|
|
||||||
|
|
||||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
|
||||||
|
|
||||||
No covered work shall be deemed part of an effective technological
|
|
||||||
measure under any applicable law fulfilling obligations under article
|
|
||||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
|
||||||
similar laws prohibiting or restricting circumvention of such
|
|
||||||
measures.
|
|
||||||
|
|
||||||
When you convey a covered work, you waive any legal power to forbid
|
|
||||||
circumvention of technological measures to the extent such circumvention
|
|
||||||
is effected by exercising rights under this License with respect to
|
|
||||||
the covered work, and you disclaim any intention to limit operation or
|
|
||||||
modification of the work as a means of enforcing, against the work's
|
|
||||||
users, your or third parties' legal rights to forbid circumvention of
|
|
||||||
technological measures.
|
|
||||||
|
|
||||||
4. Conveying Verbatim Copies.
|
|
||||||
|
|
||||||
You may convey verbatim copies of the Program's source code as you
|
|
||||||
receive it, in any medium, provided that you conspicuously and
|
|
||||||
appropriately publish on each copy an appropriate copyright notice;
|
|
||||||
keep intact all notices stating that this License and any
|
|
||||||
non-permissive terms added in accord with section 7 apply to the code;
|
|
||||||
keep intact all notices of the absence of any warranty; and give all
|
|
||||||
recipients a copy of this License along with the Program.
|
|
||||||
|
|
||||||
You may charge any price or no price for each copy that you convey,
|
|
||||||
and you may offer support or warranty protection for a fee.
|
|
||||||
|
|
||||||
5. Conveying Modified Source Versions.
|
|
||||||
|
|
||||||
You may convey a work based on the Program, or the modifications to
|
|
||||||
produce it from the Program, in the form of source code under the
|
|
||||||
terms of section 4, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) The work must carry prominent notices stating that you modified
|
|
||||||
it, and giving a relevant date.
|
|
||||||
|
|
||||||
b) The work must carry prominent notices stating that it is
|
|
||||||
released under this License and any conditions added under section
|
|
||||||
7. This requirement modifies the requirement in section 4 to
|
|
||||||
"keep intact all notices".
|
|
||||||
|
|
||||||
c) You must license the entire work, as a whole, under this
|
|
||||||
License to anyone who comes into possession of a copy. This
|
|
||||||
License will therefore apply, along with any applicable section 7
|
|
||||||
additional terms, to the whole of the work, and all its parts,
|
|
||||||
regardless of how they are packaged. This License gives no
|
|
||||||
permission to license the work in any other way, but it does not
|
|
||||||
invalidate such permission if you have separately received it.
|
|
||||||
|
|
||||||
d) If the work has interactive user interfaces, each must display
|
|
||||||
Appropriate Legal Notices; however, if the Program has interactive
|
|
||||||
interfaces that do not display Appropriate Legal Notices, your
|
|
||||||
work need not make them do so.
|
|
||||||
|
|
||||||
A compilation of a covered work with other separate and independent
|
|
||||||
works, which are not by their nature extensions of the covered work,
|
|
||||||
and which are not combined with it such as to form a larger program,
|
|
||||||
in or on a volume of a storage or distribution medium, is called an
|
|
||||||
"aggregate" if the compilation and its resulting copyright are not
|
|
||||||
used to limit the access or legal rights of the compilation's users
|
|
||||||
beyond what the individual works permit. Inclusion of a covered work
|
|
||||||
in an aggregate does not cause this License to apply to the other
|
|
||||||
parts of the aggregate.
|
|
||||||
|
|
||||||
6. Conveying Non-Source Forms.
|
|
||||||
|
|
||||||
You may convey a covered work in object code form under the terms
|
|
||||||
of sections 4 and 5, provided that you also convey the
|
|
||||||
machine-readable Corresponding Source under the terms of this License,
|
|
||||||
in one of these ways:
|
|
||||||
|
|
||||||
a) Convey the object code in, or embodied in, a physical product
|
|
||||||
(including a physical distribution medium), accompanied by the
|
|
||||||
Corresponding Source fixed on a durable physical medium
|
|
||||||
customarily used for software interchange.
|
|
||||||
|
|
||||||
b) Convey the object code in, or embodied in, a physical product
|
|
||||||
(including a physical distribution medium), accompanied by a
|
|
||||||
written offer, valid for at least three years and valid for as
|
|
||||||
long as you offer spare parts or customer support for that product
|
|
||||||
model, to give anyone who possesses the object code either (1) a
|
|
||||||
copy of the Corresponding Source for all the software in the
|
|
||||||
product that is covered by this License, on a durable physical
|
|
||||||
medium customarily used for software interchange, for a price no
|
|
||||||
more than your reasonable cost of physically performing this
|
|
||||||
conveying of source, or (2) access to copy the
|
|
||||||
Corresponding Source from a network server at no charge.
|
|
||||||
|
|
||||||
c) Convey individual copies of the object code with a copy of the
|
|
||||||
written offer to provide the Corresponding Source. This
|
|
||||||
alternative is allowed only occasionally and noncommercially, and
|
|
||||||
only if you received the object code with such an offer, in accord
|
|
||||||
with subsection 6b.
|
|
||||||
|
|
||||||
d) Convey the object code by offering access from a designated
|
|
||||||
place (gratis or for a charge), and offer equivalent access to the
|
|
||||||
Corresponding Source in the same way through the same place at no
|
|
||||||
further charge. You need not require recipients to copy the
|
|
||||||
Corresponding Source along with the object code. If the place to
|
|
||||||
copy the object code is a network server, the Corresponding Source
|
|
||||||
may be on a different server (operated by you or a third party)
|
|
||||||
that supports equivalent copying facilities, provided you maintain
|
|
||||||
clear directions next to the object code saying where to find the
|
|
||||||
Corresponding Source. Regardless of what server hosts the
|
|
||||||
Corresponding Source, you remain obligated to ensure that it is
|
|
||||||
available for as long as needed to satisfy these requirements.
|
|
||||||
|
|
||||||
e) Convey the object code using peer-to-peer transmission, provided
|
|
||||||
you inform other peers where the object code and Corresponding
|
|
||||||
Source of the work are being offered to the general public at no
|
|
||||||
charge under subsection 6d.
|
|
||||||
|
|
||||||
A separable portion of the object code, whose source code is excluded
|
|
||||||
from the Corresponding Source as a System Library, need not be
|
|
||||||
included in conveying the object code work.
|
|
||||||
|
|
||||||
A "User Product" is either (1) a "consumer product", which means any
|
|
||||||
tangible personal property which is normally used for personal, family,
|
|
||||||
or household purposes, or (2) anything designed or sold for incorporation
|
|
||||||
into a dwelling. In determining whether a product is a consumer product,
|
|
||||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
|
||||||
product received by a particular user, "normally used" refers to a
|
|
||||||
typical or common use of that class of product, regardless of the status
|
|
||||||
of the particular user or of the way in which the particular user
|
|
||||||
actually uses, or expects or is expected to use, the product. A product
|
|
||||||
is a consumer product regardless of whether the product has substantial
|
|
||||||
commercial, industrial or non-consumer uses, unless such uses represent
|
|
||||||
the only significant mode of use of the product.
|
|
||||||
|
|
||||||
"Installation Information" for a User Product means any methods,
|
|
||||||
procedures, authorization keys, or other information required to install
|
|
||||||
and execute modified versions of a covered work in that User Product from
|
|
||||||
a modified version of its Corresponding Source. The information must
|
|
||||||
suffice to ensure that the continued functioning of the modified object
|
|
||||||
code is in no case prevented or interfered with solely because
|
|
||||||
modification has been made.
|
|
||||||
|
|
||||||
If you convey an object code work under this section in, or with, or
|
|
||||||
specifically for use in, a User Product, and the conveying occurs as
|
|
||||||
part of a transaction in which the right of possession and use of the
|
|
||||||
User Product is transferred to the recipient in perpetuity or for a
|
|
||||||
fixed term (regardless of how the transaction is characterized), the
|
|
||||||
Corresponding Source conveyed under this section must be accompanied
|
|
||||||
by the Installation Information. But this requirement does not apply
|
|
||||||
if neither you nor any third party retains the ability to install
|
|
||||||
modified object code on the User Product (for example, the work has
|
|
||||||
been installed in ROM).
|
|
||||||
|
|
||||||
The requirement to provide Installation Information does not include a
|
|
||||||
requirement to continue to provide support service, warranty, or updates
|
|
||||||
for a work that has been modified or installed by the recipient, or for
|
|
||||||
the User Product in which it has been modified or installed. Access to a
|
|
||||||
network may be denied when the modification itself materially and
|
|
||||||
adversely affects the operation of the network or violates the rules and
|
|
||||||
protocols for communication across the network.
|
|
||||||
|
|
||||||
Corresponding Source conveyed, and Installation Information provided,
|
|
||||||
in accord with this section must be in a format that is publicly
|
|
||||||
documented (and with an implementation available to the public in
|
|
||||||
source code form), and must require no special password or key for
|
|
||||||
unpacking, reading or copying.
|
|
||||||
|
|
||||||
7. Additional Terms.
|
|
||||||
|
|
||||||
"Additional permissions" are terms that supplement the terms of this
|
|
||||||
License by making exceptions from one or more of its conditions.
|
|
||||||
Additional permissions that are applicable to the entire Program shall
|
|
||||||
be treated as though they were included in this License, to the extent
|
|
||||||
that they are valid under applicable law. If additional permissions
|
|
||||||
apply only to part of the Program, that part may be used separately
|
|
||||||
under those permissions, but the entire Program remains governed by
|
|
||||||
this License without regard to the additional permissions.
|
|
||||||
|
|
||||||
When you convey a copy of a covered work, you may at your option
|
|
||||||
remove any additional permissions from that copy, or from any part of
|
|
||||||
it. (Additional permissions may be written to require their own
|
|
||||||
removal in certain cases when you modify the work.) You may place
|
|
||||||
additional permissions on material, added by you to a covered work,
|
|
||||||
for which you have or can give appropriate copyright permission.
|
|
||||||
|
|
||||||
Notwithstanding any other provision of this License, for material you
|
|
||||||
add to a covered work, you may (if authorized by the copyright holders of
|
|
||||||
that material) supplement the terms of this License with terms:
|
|
||||||
|
|
||||||
a) Disclaiming warranty or limiting liability differently from the
|
|
||||||
terms of sections 15 and 16 of this License; or
|
|
||||||
|
|
||||||
b) Requiring preservation of specified reasonable legal notices or
|
|
||||||
author attributions in that material or in the Appropriate Legal
|
|
||||||
Notices displayed by works containing it; or
|
|
||||||
|
|
||||||
c) Prohibiting misrepresentation of the origin of that material, or
|
|
||||||
requiring that modified versions of such material be marked in
|
|
||||||
reasonable ways as different from the original version; or
|
|
||||||
|
|
||||||
d) Limiting the use for publicity purposes of names of licensors or
|
|
||||||
authors of the material; or
|
|
||||||
|
|
||||||
e) Declining to grant rights under trademark law for use of some
|
|
||||||
trade names, trademarks, or service marks; or
|
|
||||||
|
|
||||||
f) Requiring indemnification of licensors and authors of that
|
|
||||||
material by anyone who conveys the material (or modified versions of
|
|
||||||
it) with contractual assumptions of liability to the recipient, for
|
|
||||||
any liability that these contractual assumptions directly impose on
|
|
||||||
those licensors and authors.
|
|
||||||
|
|
||||||
All other non-permissive additional terms are considered "further
|
|
||||||
restrictions" within the meaning of section 10. If the Program as you
|
|
||||||
received it, or any part of it, contains a notice stating that it is
|
|
||||||
governed by this License along with a term that is a further
|
|
||||||
restriction, you may remove that term. If a license document contains
|
|
||||||
a further restriction but permits relicensing or conveying under this
|
|
||||||
License, you may add to a covered work material governed by the terms
|
|
||||||
of that license document, provided that the further restriction does
|
|
||||||
not survive such relicensing or conveying.
|
|
||||||
|
|
||||||
If you add terms to a covered work in accord with this section, you
|
|
||||||
must place, in the relevant source files, a statement of the
|
|
||||||
additional terms that apply to those files, or a notice indicating
|
|
||||||
where to find the applicable terms.
|
|
||||||
|
|
||||||
Additional terms, permissive or non-permissive, may be stated in the
|
|
||||||
form of a separately written license, or stated as exceptions;
|
|
||||||
the above requirements apply either way.
|
|
||||||
|
|
||||||
8. Termination.
|
|
||||||
|
|
||||||
You may not propagate or modify a covered work except as expressly
|
|
||||||
provided under this License. Any attempt otherwise to propagate or
|
|
||||||
modify it is void, and will automatically terminate your rights under
|
|
||||||
this License (including any patent licenses granted under the third
|
|
||||||
paragraph of section 11).
|
|
||||||
|
|
||||||
However, if you cease all violation of this License, then your
|
|
||||||
license from a particular copyright holder is reinstated (a)
|
|
||||||
provisionally, unless and until the copyright holder explicitly and
|
|
||||||
finally terminates your license, and (b) permanently, if the copyright
|
|
||||||
holder fails to notify you of the violation by some reasonable means
|
|
||||||
prior to 60 days after the cessation.
|
|
||||||
|
|
||||||
Moreover, your license from a particular copyright holder is
|
|
||||||
reinstated permanently if the copyright holder notifies you of the
|
|
||||||
violation by some reasonable means, this is the first time you have
|
|
||||||
received notice of violation of this License (for any work) from that
|
|
||||||
copyright holder, and you cure the violation prior to 30 days after
|
|
||||||
your receipt of the notice.
|
|
||||||
|
|
||||||
Termination of your rights under this section does not terminate the
|
|
||||||
licenses of parties who have received copies or rights from you under
|
|
||||||
this License. If your rights have been terminated and not permanently
|
|
||||||
reinstated, you do not qualify to receive new licenses for the same
|
|
||||||
material under section 10.
|
|
||||||
|
|
||||||
9. Acceptance Not Required for Having Copies.
|
|
||||||
|
|
||||||
You are not required to accept this License in order to receive or
|
|
||||||
run a copy of the Program. Ancillary propagation of a covered work
|
|
||||||
occurring solely as a consequence of using peer-to-peer transmission
|
|
||||||
to receive a copy likewise does not require acceptance. However,
|
|
||||||
nothing other than this License grants you permission to propagate or
|
|
||||||
modify any covered work. These actions infringe copyright if you do
|
|
||||||
not accept this License. Therefore, by modifying or propagating a
|
|
||||||
covered work, you indicate your acceptance of this License to do so.
|
|
||||||
|
|
||||||
10. Automatic Licensing of Downstream Recipients.
|
|
||||||
|
|
||||||
Each time you convey a covered work, the recipient automatically
|
|
||||||
receives a license from the original licensors, to run, modify and
|
|
||||||
propagate that work, subject to this License. You are not responsible
|
|
||||||
for enforcing compliance by third parties with this License.
|
|
||||||
|
|
||||||
An "entity transaction" is a transaction transferring control of an
|
|
||||||
organization, or substantially all assets of one, or subdividing an
|
|
||||||
organization, or merging organizations. If propagation of a covered
|
|
||||||
work results from an entity transaction, each party to that
|
|
||||||
transaction who receives a copy of the work also receives whatever
|
|
||||||
licenses to the work the party's predecessor in interest had or could
|
|
||||||
give under the previous paragraph, plus a right to possession of the
|
|
||||||
Corresponding Source of the work from the predecessor in interest, if
|
|
||||||
the predecessor has it or can get it with reasonable efforts.
|
|
||||||
|
|
||||||
You may not impose any further restrictions on the exercise of the
|
|
||||||
rights granted or affirmed under this License. For example, you may
|
|
||||||
not impose a license fee, royalty, or other charge for exercise of
|
|
||||||
rights granted under this License, and you may not initiate litigation
|
|
||||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
|
||||||
any patent claim is infringed by making, using, selling, offering for
|
|
||||||
sale, or importing the Program or any portion of it.
|
|
||||||
|
|
||||||
11. Patents.
|
|
||||||
|
|
||||||
A "contributor" is a copyright holder who authorizes use under this
|
|
||||||
License of the Program or a work on which the Program is based. The
|
|
||||||
work thus licensed is called the contributor's "contributor version".
|
|
||||||
|
|
||||||
A contributor's "essential patent claims" are all patent claims
|
|
||||||
owned or controlled by the contributor, whether already acquired or
|
|
||||||
hereafter acquired, that would be infringed by some manner, permitted
|
|
||||||
by this License, of making, using, or selling its contributor version,
|
|
||||||
but do not include claims that would be infringed only as a
|
|
||||||
consequence of further modification of the contributor version. For
|
|
||||||
purposes of this definition, "control" includes the right to grant
|
|
||||||
patent sublicenses in a manner consistent with the requirements of
|
|
||||||
this License.
|
|
||||||
|
|
||||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
|
||||||
patent license under the contributor's essential patent claims, to
|
|
||||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
|
||||||
propagate the contents of its contributor version.
|
|
||||||
|
|
||||||
In the following three paragraphs, a "patent license" is any express
|
|
||||||
agreement or commitment, however denominated, not to enforce a patent
|
|
||||||
(such as an express permission to practice a patent or covenant not to
|
|
||||||
sue for patent infringement). To "grant" such a patent license to a
|
|
||||||
party means to make such an agreement or commitment not to enforce a
|
|
||||||
patent against the party.
|
|
||||||
|
|
||||||
If you convey a covered work, knowingly relying on a patent license,
|
|
||||||
and the Corresponding Source of the work is not available for anyone
|
|
||||||
to copy, free of charge and under the terms of this License, through a
|
|
||||||
publicly available network server or other readily accessible means,
|
|
||||||
then you must either (1) cause the Corresponding Source to be so
|
|
||||||
available, or (2) arrange to deprive yourself of the benefit of the
|
|
||||||
patent license for this particular work, or (3) arrange, in a manner
|
|
||||||
consistent with the requirements of this License, to extend the patent
|
|
||||||
license to downstream recipients. "Knowingly relying" means you have
|
|
||||||
actual knowledge that, but for the patent license, your conveying the
|
|
||||||
covered work in a country, or your recipient's use of the covered work
|
|
||||||
in a country, would infringe one or more identifiable patents in that
|
|
||||||
country that you have reason to believe are valid.
|
|
||||||
|
|
||||||
If, pursuant to or in connection with a single transaction or
|
|
||||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
|
||||||
covered work, and grant a patent license to some of the parties
|
|
||||||
receiving the covered work authorizing them to use, propagate, modify
|
|
||||||
or convey a specific copy of the covered work, then the patent license
|
|
||||||
you grant is automatically extended to all recipients of the covered
|
|
||||||
work and works based on it.
|
|
||||||
|
|
||||||
A patent license is "discriminatory" if it does not include within
|
|
||||||
the scope of its coverage, prohibits the exercise of, or is
|
|
||||||
conditioned on the non-exercise of one or more of the rights that are
|
|
||||||
specifically granted under this License. You may not convey a covered
|
|
||||||
work if you are a party to an arrangement with a third party that is
|
|
||||||
in the business of distributing software, under which you make payment
|
|
||||||
to the third party based on the extent of your activity of conveying
|
|
||||||
the work, and under which the third party grants, to any of the
|
|
||||||
parties who would receive the covered work from you, a discriminatory
|
|
||||||
patent license (a) in connection with copies of the covered work
|
|
||||||
conveyed by you (or copies made from those copies), or (b) primarily
|
|
||||||
for and in connection with specific products or compilations that
|
|
||||||
contain the covered work, unless you entered into that arrangement,
|
|
||||||
or that patent license was granted, prior to 28 March 2007.
|
|
||||||
|
|
||||||
Nothing in this License shall be construed as excluding or limiting
|
|
||||||
any implied license or other defenses to infringement that may
|
|
||||||
otherwise be available to you under applicable patent law.
|
|
||||||
|
|
||||||
12. No Surrender of Others' Freedom.
|
|
||||||
|
|
||||||
If conditions are imposed on you (whether by court order, agreement or
|
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
|
||||||
excuse you from the conditions of this License. If you cannot convey a
|
|
||||||
covered work so as to satisfy simultaneously your obligations under this
|
|
||||||
License and any other pertinent obligations, then as a consequence you may
|
|
||||||
not convey it at all. For example, if you agree to terms that obligate you
|
|
||||||
to collect a royalty for further conveying from those to whom you convey
|
|
||||||
the Program, the only way you could satisfy both those terms and this
|
|
||||||
License would be to refrain entirely from conveying the Program.
|
|
||||||
|
|
||||||
13. Use with the GNU Affero General Public License.
|
|
||||||
|
|
||||||
Notwithstanding any other provision of this License, you have
|
|
||||||
permission to link or combine any covered work with a work licensed
|
|
||||||
under version 3 of the GNU Affero General Public License into a single
|
|
||||||
combined work, and to convey the resulting work. The terms of this
|
|
||||||
License will continue to apply to the part which is the covered work,
|
|
||||||
but the special requirements of the GNU Affero General Public License,
|
|
||||||
section 13, concerning interaction through a network will apply to the
|
|
||||||
combination as such.
|
|
||||||
|
|
||||||
14. Revised Versions of this License.
|
|
||||||
|
|
||||||
The Free Software Foundation may publish revised and/or new versions of
|
|
||||||
the GNU General Public License from time to time. Such new versions will
|
|
||||||
be similar in spirit to the present version, but may differ in detail to
|
|
||||||
address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the
|
|
||||||
Program specifies that a certain numbered version of the GNU General
|
|
||||||
Public License "or any later version" applies to it, you have the
|
|
||||||
option of following the terms and conditions either of that numbered
|
|
||||||
version or of any later version published by the Free Software
|
|
||||||
Foundation. If the Program does not specify a version number of the
|
|
||||||
GNU General Public License, you may choose any version ever published
|
|
||||||
by the Free Software Foundation.
|
|
||||||
|
|
||||||
If the Program specifies that a proxy can decide which future
|
|
||||||
versions of the GNU General Public License can be used, that proxy's
|
|
||||||
public statement of acceptance of a version permanently authorizes you
|
|
||||||
to choose that version for the Program.
|
|
||||||
|
|
||||||
Later license versions may give you additional or different
|
|
||||||
permissions. However, no additional obligations are imposed on any
|
|
||||||
author or copyright holder as a result of your choosing to follow a
|
|
||||||
later version.
|
|
||||||
|
|
||||||
15. Disclaimer of Warranty.
|
|
||||||
|
|
||||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
|
||||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
|
||||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
|
||||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
||||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
|
||||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
|
||||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
|
||||||
|
|
||||||
16. Limitation of Liability.
|
|
||||||
|
|
||||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
|
||||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
|
||||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
|
||||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
|
||||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
|
||||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
|
||||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
|
||||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
|
||||||
SUCH DAMAGES.
|
|
||||||
|
|
||||||
17. Interpretation of Sections 15 and 16.
|
|
||||||
|
|
||||||
If the disclaimer of warranty and limitation of liability provided
|
|
||||||
above cannot be given local legal effect according to their terms,
|
|
||||||
reviewing courts shall apply local law that most closely approximates
|
|
||||||
an absolute waiver of all civil liability in connection with the
|
|
||||||
Program, unless a warranty or assumption of liability accompanies a
|
|
||||||
copy of the Program in return for a fee.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
|
||||||
possible use to the public, the best way to achieve this is to make it
|
|
||||||
free software which everyone can redistribute and change under these terms.
|
|
||||||
|
|
||||||
To do so, attach the following notices to the program. It is safest
|
|
||||||
to attach them to the start of each source file to most effectively
|
|
||||||
state the exclusion of warranty; and each file should have at least
|
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
|
||||||
|
|
||||||
<one line to give the program's name and a brief idea of what it does.>
|
|
||||||
Copyright (C) <year> <name of author>
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
If the program does terminal interaction, make it output a short
|
|
||||||
notice like this when it starts in an interactive mode:
|
|
||||||
|
|
||||||
<program> Copyright (C) <year> <name of author>
|
|
||||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
|
||||||
This is free software, and you are welcome to redistribute it
|
|
||||||
under certain conditions; type `show c' for details.
|
|
||||||
|
|
||||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
|
||||||
parts of the General Public License. Of course, your program's commands
|
|
||||||
might be different; for a GUI interface, you would use an "about box".
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or school,
|
|
||||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
|
||||||
For more information on this, and how to apply and follow the GNU GPL, see
|
|
||||||
<https://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
The GNU General Public License does not permit incorporating your program
|
|
||||||
into proprietary programs. If your program is a subroutine library, you
|
|
||||||
may consider it more useful to permit linking proprietary applications with
|
|
||||||
the library. If this is what you want to do, use the GNU Lesser General
|
|
||||||
Public License instead of this License. But first, please read
|
|
||||||
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
|
@ -1 +0,0 @@
|
|||||||
GPL-2.0-or-later
|
|
@ -1,110 +0,0 @@
|
|||||||
UMKa -- User-Mode KolibriOS developer tools
|
|
||||||
===========================================
|
|
||||||
|
|
||||||
This is a common project for a set of KolibriOS developer tools which are based
|
|
||||||
on original KolibriOS kernel code wrapped and hacked as to run in the UNIX
|
|
||||||
programming environment. The idea is to make userspace UNIX tools that use as
|
|
||||||
much unchanged KolibriOS kernel source as possible to test
|
|
||||||
architecture-independent parts of the kernel in your favorite developer
|
|
||||||
environment.
|
|
||||||
|
|
||||||
|
|
||||||
umka_shell
|
|
||||||
----------
|
|
||||||
|
|
||||||
is an interactive shell with commands that are wrappers around KolibriOS kernel
|
|
||||||
syscalls and other internal functions. What works now: block layer including
|
|
||||||
disk cache, FS, UI and graphics, scheduler, ACPI/AML interpreter,
|
|
||||||
synchronization primitives, strings, slab allocator, events, unpacker, other
|
|
||||||
minor functions.
|
|
||||||
|
|
||||||
It can also be used for automated testing by feeding it a file of commands
|
|
||||||
instead of typing them.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
$ umka_shell < mytest.t > mytest.out.log
|
|
||||||
|
|
||||||
|
|
||||||
umka_fuse
|
|
||||||
---------
|
|
||||||
|
|
||||||
is like umka_shell above but commands are translated from FUSE calls, not
|
|
||||||
entered manually or read from a file. Can *potentially* be used to run xfstests
|
|
||||||
(cross-fs-tests) and automated tests against reference FS implementation.
|
|
||||||
|
|
||||||
|
|
||||||
umka_os
|
|
||||||
-------
|
|
||||||
|
|
||||||
is KolibriOS kernel running main loop (osloop), scheduler and all the threads
|
|
||||||
including network stack.
|
|
||||||
|
|
||||||
|
|
||||||
tools
|
|
||||||
-----
|
|
||||||
|
|
||||||
mkdirrange
|
|
||||||
|
|
||||||
mkfilepattern
|
|
||||||
|
|
||||||
lfbviewx
|
|
||||||
|
|
||||||
|
|
||||||
BUILD
|
|
||||||
-----
|
|
||||||
|
|
||||||
$ KOLIBRIOS=/path/to/kolibrios make
|
|
||||||
|
|
||||||
/path/to/kolibrios is where you checked out 'svn co svn://kolibrios.org'.
|
|
||||||
|
|
||||||
|
|
||||||
Architecture
|
|
||||||
------------
|
|
||||||
|
|
||||||
Kernel services are replaced with stubs, wrappers around userspace
|
|
||||||
implementation or libc calls. Block devices are emulated with regular files.
|
|
||||||
Framebuffer can be dumped to disk as image file.
|
|
||||||
|
|
||||||
|
|
||||||
Testing
|
|
||||||
-------
|
|
||||||
|
|
||||||
sudo cp --parents /sys/firmware/acpi/tables/?SDT* /sys/bus/pci/devices/*/config .
|
|
||||||
|
|
||||||
|
|
||||||
Troubleshooting
|
|
||||||
---------------
|
|
||||||
|
|
||||||
# lfbviewx
|
|
||||||
|
|
||||||
Allow reading process_vm_readv syscall.
|
|
||||||
|
|
||||||
# sysctl -w kernel.yama.ptrace_scope=0
|
|
||||||
|
|
||||||
# umka_os
|
|
||||||
|
|
||||||
Managing tap devices.
|
|
||||||
|
|
||||||
# ip tuntap add dev tap0 mode tap
|
|
||||||
# ip link set tap0 address 00:11:00:00:00:00
|
|
||||||
# ip addr add 10.50.0.1/24 dev tap0
|
|
||||||
# ip link set up dev tap0
|
|
||||||
# ip tuntap del dev tap0 mode tap
|
|
||||||
|
|
||||||
To create tap devices.
|
|
||||||
|
|
||||||
# setcap cap_net_admin+ep ../umka_os
|
|
||||||
|
|
||||||
Not yet used, but may be one day.
|
|
||||||
|
|
||||||
# sysctl -w vm.mmap_min_addr=0
|
|
||||||
|
|
||||||
|
|
||||||
Links & Acknowledgements
|
|
||||||
------------------------
|
|
||||||
|
|
||||||
[1] Filesystem in Userspace library
|
|
||||||
https://github.com/libfuse/libfuse
|
|
||||||
|
|
||||||
[2] LodePNG by Lode Vandevenne
|
|
||||||
https://lodev.org/lodepng/
|
|
@ -1,4 +0,0 @@
|
|||||||
multithreaded: kofu one.t two.t
|
|
||||||
compare with reference XFS implementation
|
|
||||||
stressing via ref impl
|
|
||||||
|
|
@ -1,165 +0,0 @@
|
|||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <inttypes.h>
|
|
||||||
|
|
||||||
#define MAX_COVERED_CODE_SIZE (256*1024)
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint64_t to_cnt, from_cnt;
|
|
||||||
} branch;
|
|
||||||
|
|
||||||
branch branches[MAX_COVERED_CODE_SIZE];
|
|
||||||
|
|
||||||
uint32_t coverage_offset, coverage_begin, coverage_end;
|
|
||||||
|
|
||||||
void read_coverage_file(const char *fname) {
|
|
||||||
FILE *f = fopen(fname, "r");
|
|
||||||
fseeko(f, 0, SEEK_END);
|
|
||||||
off_t fsize = ftello(f);
|
|
||||||
fseeko(f, 0, SEEK_SET);
|
|
||||||
fread(&coverage_begin, sizeof(uint32_t), 1, f);
|
|
||||||
fread(&coverage_end, sizeof(uint32_t), 1, f);
|
|
||||||
size_t branch_cnt = (fsize-4*2)/(2*4);
|
|
||||||
for (size_t i = 0; i < branch_cnt; i++) {
|
|
||||||
uint32_t from, to;
|
|
||||||
fread(&from, sizeof(uint32_t), 1, f);
|
|
||||||
fread(&to, sizeof(uint32_t), 1, f);
|
|
||||||
if (from >= coverage_begin && from < coverage_end) {
|
|
||||||
from = from - coverage_begin + coverage_offset;
|
|
||||||
branches[from].from_cnt++;
|
|
||||||
}
|
|
||||||
if (to >= coverage_begin && to < coverage_end) {
|
|
||||||
to = to - coverage_begin + coverage_offset;
|
|
||||||
branches[to].to_cnt++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fclose(f);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t count_line_bytes(const char *s) {
|
|
||||||
size_t cnt = 0;
|
|
||||||
for (size_t i = 10; i <= 58; i += 3) {
|
|
||||||
if (s[i] == ' ') break;
|
|
||||||
cnt++;
|
|
||||||
}
|
|
||||||
return cnt;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t count_block_bytes(FILE *f) {
|
|
||||||
char tmp[1024];
|
|
||||||
size_t cnt = 0;
|
|
||||||
if (fgets(tmp, 1024, f) && strspn(tmp, "0123456789ABCDEF") == 8) {
|
|
||||||
cnt = count_line_bytes(tmp);
|
|
||||||
while (fgets(tmp, 1024, f) && tmp[0] == ' ' && tmp[10] != ' ') {
|
|
||||||
cnt += count_line_bytes(tmp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return cnt;
|
|
||||||
}
|
|
||||||
|
|
||||||
int is_cond_jump(const char *s) {
|
|
||||||
s += strspn(s, " \t");
|
|
||||||
int found = !strncmp(s, "jo", 2)
|
|
||||||
|| !strncmp(s, "jno", 3)
|
|
||||||
|| !strncmp(s, "js", 2)
|
|
||||||
|| !strncmp(s, "jns", 3)
|
|
||||||
|| !strncmp(s, "je", 2)
|
|
||||||
|| !strncmp(s, "jne", 3)
|
|
||||||
|| !strncmp(s, "jz", 2)
|
|
||||||
|| !strncmp(s, "jnz", 3)
|
|
||||||
|| !strncmp(s, "jb", 2)
|
|
||||||
|| !strncmp(s, "jnb", 3)
|
|
||||||
|| !strncmp(s, "jc", 2)
|
|
||||||
|| !strncmp(s, "jnc", 3)
|
|
||||||
|| !strncmp(s, "jae", 3)
|
|
||||||
|| !strncmp(s, "jnae", 4)
|
|
||||||
|| !strncmp(s, "jbe", 3)
|
|
||||||
|| !strncmp(s, "jna", 3)
|
|
||||||
|| !strncmp(s, "ja", 2)
|
|
||||||
|| !strncmp(s, "jnbe", 4)
|
|
||||||
|| !strncmp(s, "jl", 2)
|
|
||||||
|| !strncmp(s, "jnge", 4)
|
|
||||||
|| !strncmp(s, "jge", 3)
|
|
||||||
|| !strncmp(s, "jnl", 3)
|
|
||||||
|| !strncmp(s, "jle", 3)
|
|
||||||
|| !strncmp(s, "jng", 3)
|
|
||||||
|| !strncmp(s, "jg",2)
|
|
||||||
|| !strncmp(s, "jnle", 4)
|
|
||||||
|| !strncmp(s, "jp", 2)
|
|
||||||
|| !strncmp(s, "jpe", 3)
|
|
||||||
|| !strncmp(s, "jnp", 3)
|
|
||||||
|| !strncmp(s, "jpo", 3)
|
|
||||||
|| !strncmp(s, "jcxz", 4)
|
|
||||||
|| !strncmp(s, "jecxz", 5);
|
|
||||||
return found;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
|
||||||
if (argc < 4) {
|
|
||||||
fprintf(stderr, "usage: covpreproc <listing file> <coverage_begin offset> <coverage files ...>\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
sscanf(argv[2], "%" SCNx32, &coverage_offset);
|
|
||||||
|
|
||||||
for (int i = 3; i < argc; i++) {
|
|
||||||
read_coverage_file(argv[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
FILE *f = fopen(argv[1], "r");
|
|
||||||
char tmp[1024];
|
|
||||||
uint64_t cur = 0, taken, not_taken;
|
|
||||||
while (1) {
|
|
||||||
off_t fpos_before = ftello(f);
|
|
||||||
if (!fgets(tmp, 1024, f)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
off_t fpos_after = ftello(f);
|
|
||||||
if (strspn(tmp, "0123456789ABCDEF") == 8) {
|
|
||||||
int is_cond = is_cond_jump(tmp + 64);
|
|
||||||
fseeko(f, fpos_before, SEEK_SET);
|
|
||||||
size_t inst_len = count_block_bytes(f);
|
|
||||||
fseeko(f, fpos_after, SEEK_SET);
|
|
||||||
unsigned long pos = strtoul(tmp, NULL, 16);
|
|
||||||
size_t total_to = 0, total_from = 0;
|
|
||||||
for (size_t i = 0; i < inst_len; i++) {
|
|
||||||
if (pos + i < coverage_end - coverage_begin + coverage_offset) {
|
|
||||||
total_to += branches[pos + i].to_cnt;
|
|
||||||
total_from += branches[pos + i].from_cnt;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cur += total_to;
|
|
||||||
if (is_cond) {
|
|
||||||
taken = total_from;
|
|
||||||
not_taken = cur - taken;
|
|
||||||
if (taken && not_taken) {
|
|
||||||
putchar(' ');
|
|
||||||
} else {
|
|
||||||
putchar('-');
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
putchar(' ');
|
|
||||||
}
|
|
||||||
if (cur) {
|
|
||||||
putchar(' ');
|
|
||||||
} else {
|
|
||||||
putchar('-');
|
|
||||||
}
|
|
||||||
if (is_cond) {
|
|
||||||
int spaces = 19 - printf("%10" PRIu64 "/%" PRIu64, taken, not_taken);
|
|
||||||
while (spaces-- > 0)
|
|
||||||
putchar(' ');
|
|
||||||
} else {
|
|
||||||
printf(" ");
|
|
||||||
}
|
|
||||||
printf(" %10" PRIu64, cur);
|
|
||||||
cur -= total_from;
|
|
||||||
} else {
|
|
||||||
printf(" ");
|
|
||||||
}
|
|
||||||
printf(" : %s", tmp + 64);
|
|
||||||
}
|
|
||||||
fclose(f);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
Binary file not shown.
@ -1,218 +0,0 @@
|
|||||||
#include <stddef.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "getopt.h"
|
|
||||||
|
|
||||||
char *optarg;
|
|
||||||
int optind=1, opterr=1, optopt, __optpos, optreset=0;
|
|
||||||
|
|
||||||
#define optpos __optpos
|
|
||||||
|
|
||||||
static void __getopt_msg(const char *a, const char *b, const char *c, size_t l)
|
|
||||||
{
|
|
||||||
FILE *f = stderr;
|
|
||||||
#if !defined(WIN32) && !defined(_WIN32)
|
|
||||||
flockfile(f);
|
|
||||||
#endif
|
|
||||||
fputs(a, f);
|
|
||||||
fwrite(b, strlen(b), 1, f);
|
|
||||||
fwrite(c, 1, l, f);
|
|
||||||
fputc('\n', f);
|
|
||||||
#if !defined(WIN32) && !defined(_WIN32)
|
|
||||||
funlockfile(f);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
int getopt(int argc, char * const argv[], const char *optstring)
|
|
||||||
{
|
|
||||||
int i, c, d;
|
|
||||||
int k, l;
|
|
||||||
char *optchar;
|
|
||||||
|
|
||||||
if (!optind || optreset) {
|
|
||||||
optreset = 0;
|
|
||||||
__optpos = 0;
|
|
||||||
optind = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (optind >= argc || !argv[optind])
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (argv[optind][0] != '-') {
|
|
||||||
if (optstring[0] == '-') {
|
|
||||||
optarg = argv[optind++];
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!argv[optind][1])
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (argv[optind][1] == '-' && !argv[optind][2])
|
|
||||||
return optind++, -1;
|
|
||||||
|
|
||||||
if (!optpos) optpos++;
|
|
||||||
c = argv[optind][optpos], k = 1;
|
|
||||||
optchar = argv[optind]+optpos;
|
|
||||||
optopt = c;
|
|
||||||
optpos += k;
|
|
||||||
|
|
||||||
if (!argv[optind][optpos]) {
|
|
||||||
optind++;
|
|
||||||
optpos = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (optstring[0] == '-' || optstring[0] == '+')
|
|
||||||
optstring++;
|
|
||||||
|
|
||||||
i = 0;
|
|
||||||
d = 0;
|
|
||||||
do {
|
|
||||||
d = optstring[i], l = 1;
|
|
||||||
if (l>0) i+=l; else i++;
|
|
||||||
} while (l && d != c);
|
|
||||||
|
|
||||||
if (d != c) {
|
|
||||||
if (optstring[0] != ':' && opterr)
|
|
||||||
__getopt_msg(argv[0], ": unrecognized option: ", optchar, k);
|
|
||||||
return '?';
|
|
||||||
}
|
|
||||||
if (optstring[i] == ':') {
|
|
||||||
if (optstring[i+1] == ':') optarg = 0;
|
|
||||||
else if (optind >= argc) {
|
|
||||||
if (optstring[0] == ':') return ':';
|
|
||||||
if (opterr) __getopt_msg(argv[0],
|
|
||||||
": option requires an argument: ",
|
|
||||||
optchar, k);
|
|
||||||
return '?';
|
|
||||||
}
|
|
||||||
if (optstring[i+1] != ':' || optpos) {
|
|
||||||
optarg = argv[optind++] + optpos;
|
|
||||||
optpos = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void permute(char *const *argv, int dest, int src)
|
|
||||||
{
|
|
||||||
char **av = (char **)argv;
|
|
||||||
char *tmp = av[src];
|
|
||||||
int i;
|
|
||||||
for (i=src; i>dest; i--)
|
|
||||||
av[i] = av[i-1];
|
|
||||||
av[dest] = tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int __getopt_long_core(int argc, char *const *argv, const char *optstring, const struct option *longopts, int *idx, int longonly)
|
|
||||||
{
|
|
||||||
optarg = 0;
|
|
||||||
if (longopts && argv[optind][0] == '-' &&
|
|
||||||
((longonly && argv[optind][1] && argv[optind][1] != '-') ||
|
|
||||||
(argv[optind][1] == '-' && argv[optind][2])))
|
|
||||||
{
|
|
||||||
int colon = optstring[optstring[0]=='+'||optstring[0]=='-']==':';
|
|
||||||
int i, cnt, match = -1;
|
|
||||||
char *opt;
|
|
||||||
for (cnt=i=0; longopts[i].name; i++) {
|
|
||||||
const char *name = longopts[i].name;
|
|
||||||
opt = argv[optind]+1;
|
|
||||||
if (*opt == '-') opt++;
|
|
||||||
for (; *name && *name == *opt; name++, opt++);
|
|
||||||
if (*opt && *opt != '=') continue;
|
|
||||||
match = i;
|
|
||||||
if (!*name) {
|
|
||||||
cnt = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
cnt++;
|
|
||||||
}
|
|
||||||
if (cnt==1) {
|
|
||||||
i = match;
|
|
||||||
optind++;
|
|
||||||
optopt = longopts[i].val;
|
|
||||||
if (*opt == '=') {
|
|
||||||
if (!longopts[i].has_arg) {
|
|
||||||
if (colon || !opterr)
|
|
||||||
return '?';
|
|
||||||
__getopt_msg(argv[0],
|
|
||||||
": option does not take an argument: ",
|
|
||||||
longopts[i].name,
|
|
||||||
strlen(longopts[i].name));
|
|
||||||
return '?';
|
|
||||||
}
|
|
||||||
optarg = opt+1;
|
|
||||||
} else if (longopts[i].has_arg == required_argument) {
|
|
||||||
if (!(optarg = argv[optind])) {
|
|
||||||
if (colon) return ':';
|
|
||||||
if (!opterr) return '?';
|
|
||||||
__getopt_msg(argv[0],
|
|
||||||
": option requires an argument: ",
|
|
||||||
longopts[i].name,
|
|
||||||
strlen(longopts[i].name));
|
|
||||||
return '?';
|
|
||||||
}
|
|
||||||
optind++;
|
|
||||||
}
|
|
||||||
if (idx) *idx = i;
|
|
||||||
if (longopts[i].flag) {
|
|
||||||
*longopts[i].flag = longopts[i].val;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return longopts[i].val;
|
|
||||||
}
|
|
||||||
if (argv[optind][1] == '-') {
|
|
||||||
if (!colon && opterr)
|
|
||||||
__getopt_msg(argv[0], cnt ?
|
|
||||||
": option is ambiguous: " :
|
|
||||||
": unrecognized option: ",
|
|
||||||
argv[optind]+2,
|
|
||||||
strlen(argv[optind]+2));
|
|
||||||
optind++;
|
|
||||||
return '?';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return getopt(argc, argv, optstring);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int __getopt_long(int argc, char *const *argv, const char *optstring, const struct option *longopts, int *idx, int longonly)
|
|
||||||
{
|
|
||||||
int ret, skipped, resumed;
|
|
||||||
if (!optind || optreset) {
|
|
||||||
optreset = 0;
|
|
||||||
__optpos = 0;
|
|
||||||
optind = 1;
|
|
||||||
}
|
|
||||||
if (optind >= argc || !argv[optind]) return -1;
|
|
||||||
skipped = optind;
|
|
||||||
if (optstring[0] != '+' && optstring[0] != '-') {
|
|
||||||
int i;
|
|
||||||
for (i=optind; ; i++) {
|
|
||||||
if (i >= argc || !argv[i]) return -1;
|
|
||||||
if (argv[i][0] == '-' && argv[i][1]) break;
|
|
||||||
}
|
|
||||||
optind = i;
|
|
||||||
}
|
|
||||||
resumed = optind;
|
|
||||||
ret = __getopt_long_core(argc, argv, optstring, longopts, idx, longonly);
|
|
||||||
if (resumed > skipped) {
|
|
||||||
int i, cnt = optind-resumed;
|
|
||||||
for (i=0; i<cnt; i++)
|
|
||||||
permute(argv, skipped, optind-1);
|
|
||||||
optind = skipped + cnt;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int getopt_long(int argc, char *const *argv, const char *optstring, const struct option *longopts, int *idx)
|
|
||||||
{
|
|
||||||
return __getopt_long(argc, argv, optstring, longopts, idx, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int getopt_long_only(int argc, char *const *argv, const char *optstring, const struct option *longopts, int *idx)
|
|
||||||
{
|
|
||||||
return __getopt_long(argc, argv, optstring, longopts, idx, 1);
|
|
||||||
}
|
|
||||||
|
|
@ -1,54 +0,0 @@
|
|||||||
/*
|
|
||||||
Copyright 2005-2014 Rich Felker, et al.
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of this software and associated documentation files (the
|
|
||||||
"Software"), to deal in the Software without restriction, including
|
|
||||||
without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
||||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
||||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
||||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _GETOPT_H
|
|
||||||
#define _GETOPT_H
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int getopt(int, char * const [], const char *);
|
|
||||||
extern char *optarg;
|
|
||||||
extern int optind, opterr, optopt, optreset;
|
|
||||||
|
|
||||||
struct option {
|
|
||||||
const char *name;
|
|
||||||
int has_arg;
|
|
||||||
int *flag;
|
|
||||||
int val;
|
|
||||||
};
|
|
||||||
|
|
||||||
int getopt_long(int, char *const *, const char *, const struct option *, int *);
|
|
||||||
int getopt_long_only(int, char *const *, const char *, const struct option *, int *);
|
|
||||||
|
|
||||||
#define no_argument 0
|
|
||||||
#define required_argument 1
|
|
||||||
#define optional_argument 2
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,356 +0,0 @@
|
|||||||
MKDIRRANGE=../tools/mkdirrange
|
|
||||||
MKFILEPATTERN=../tools/mkfilepattern
|
|
||||||
MOUNT_OPT=-t xfs
|
|
||||||
TEMP_DIR:=$(shell mktemp -d)
|
|
||||||
|
|
||||||
all: s05k s4k unicode v5 kolibri.img coverage
|
|
||||||
rmdir $(TEMP_DIR)
|
|
||||||
|
|
||||||
s05k: xfs_v4_ftype0_s05k_b2k_n8k.img xfs_v4_ftype1_s05k_b2k_n8k.img xfs_v4_xattr.img xfs_v4_files_s05k_b4k_n8k.img xfs_v4_ftype0_s05k_b2k_n8k_xattr.img xfs_v4_btrees_l2.img xfs_short_dir_i8.img
|
|
||||||
|
|
||||||
s4k: xfs_v4_ftype0_s4k_b4k_n8k.img
|
|
||||||
|
|
||||||
unicode: xfs_v4_unicode.img
|
|
||||||
|
|
||||||
v5: xfs_v5_ftype1_s05k_b2k_n8k.img xfs_v5_files_s05k_b4k_n8k.img
|
|
||||||
|
|
||||||
coverage: jfs.img xfs_borg_bit.img xfs_short_dir_i8.img
|
|
||||||
|
|
||||||
kolibri.img: ../default.skn
|
|
||||||
touch $@
|
|
||||||
fallocate -z -o 0 -l 1440KiB $@
|
|
||||||
mkfs.vfat -n KOLIBRIOS -F 12 $@
|
|
||||||
mcopy -vmoi $@ $< ::DEFAULT.SKN
|
|
||||||
|
|
||||||
jfs.img:
|
|
||||||
fallocate -l 16MiB $@
|
|
||||||
mkfs.jfs -q $@
|
|
||||||
fallocate -i -o 0 -l 1MiB $@
|
|
||||||
parted --script $@ mktable gpt
|
|
||||||
parted --script --align optimal $@ mkpart primary 1MiB 100%
|
|
||||||
|
|
||||||
xfs_borg_bit.img:
|
|
||||||
fallocate -l 16MiB $@
|
|
||||||
mkfs.xfs -n version=ci $@
|
|
||||||
fallocate -i -o 0 -l 1MiB $@
|
|
||||||
parted --script $@ mktable gpt
|
|
||||||
parted --script --align optimal $@ mkpart primary 1MiB 100%
|
|
||||||
|
|
||||||
xfs_short_dir_i8.img:
|
|
||||||
echo -en "\x00" > $@
|
|
||||||
fallocate -i -o 0 -l 42TiB $@
|
|
||||||
mkfs.xfs -b size=2k -m crc=0,finobt=0,rmapbt=0,reflink=0 -d sectsize=512 -i maxpct=100,size=256 -n size=8k,ftype=0 $@
|
|
||||||
#
|
|
||||||
sudo mount $(MOUNT_OPT) $@ $(TEMP_DIR)
|
|
||||||
sudo chown $$USER $(TEMP_DIR) -R
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/sf
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/sf 0 5 0 244
|
|
||||||
#
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/sf/d0000000002_xx 7 10 0 244
|
|
||||||
#
|
|
||||||
sudo umount $(TEMP_DIR)
|
|
||||||
fallocate -i -o 0 -l 1MiB $@
|
|
||||||
parted --script $@ mktable gpt
|
|
||||||
parted --script --align optimal $@ mkpart primary 1MiB 100%
|
|
||||||
|
|
||||||
xfs_v4_ftype0_s05k_b2k_n8k.img:
|
|
||||||
fallocate -l 63MiB $@
|
|
||||||
mkfs.xfs -b size=2k -m crc=0,finobt=0,rmapbt=0,reflink=0 -d sectsize=512 -i maxpct=100 -n size=8k,ftype=0 $@
|
|
||||||
sudo mount $(MOUNT_OPT) $@ $(TEMP_DIR)
|
|
||||||
sudo chown $$USER $(TEMP_DIR) -R
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/sf_empty
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/sf
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/sf 0 3 0 244
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/block
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/block 0 5 234 10
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/leaf
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/leaf 0 40 214 30
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/node
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/node 0 1100 0 23
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/btree_leaf
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/btree_leaf 0 1000 201 43
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/btree_leaf_free
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/btree_leaf_free 0 1200 201 43
|
|
||||||
#
|
|
||||||
sudo umount $(TEMP_DIR)
|
|
||||||
fallocate -i -o 0 -l 1MiB $@
|
|
||||||
parted --script $@ mktable gpt
|
|
||||||
parted --script --align optimal $@ mkpart primary 1MiB 100%
|
|
||||||
|
|
||||||
xfs_v4_ftype1_s05k_b2k_n8k.img:
|
|
||||||
fallocate -l 63MiB $@
|
|
||||||
mkfs.xfs -b size=2k -m crc=0,finobt=0,rmapbt=0,reflink=0 -d sectsize=512 -i maxpct=100 -n size=8k,ftype=1 $@
|
|
||||||
sudo mount $(MOUNT_OPT) $@ $(TEMP_DIR)
|
|
||||||
sudo chown $$USER $(TEMP_DIR) -R
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/sf_empty
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/sf
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/sf 0 3 0 244
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/block
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/block 0 5 234 10
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/leaf
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/leaf 0 40 214 30
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/node
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/node 0 1100 0 23
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/btree_leaf
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/btree_leaf 0 1000 201 43
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/btree_leaf_free
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/btree_leaf_free 0 1200 201 43
|
|
||||||
#
|
|
||||||
sudo umount $(TEMP_DIR)
|
|
||||||
fallocate -i -o 0 -l 1MiB $@
|
|
||||||
parted --script $@ mktable gpt
|
|
||||||
parted --script --align optimal $@ mkpart primary 1MiB 100%
|
|
||||||
|
|
||||||
xfs_v4_xattr.img:
|
|
||||||
fallocate -l 63MiB $@
|
|
||||||
mkfs.xfs -m crc=0,finobt=0,rmapbt=0,reflink=0 -d sectsize=512 -i maxpct=100 -n ftype=0 $@
|
|
||||||
sudo mount $(MOUNT_OPT) $@ $(TEMP_DIR) -o attr2
|
|
||||||
sudo chown $$USER $(TEMP_DIR) -R
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/sf
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/sf 0 900 0 244
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/leaf
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/leaf 0 600 0 244
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/node
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/node 0 600 0 244
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/btree
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/btree 0 600 0 244
|
|
||||||
#
|
|
||||||
sudo umount $(TEMP_DIR)
|
|
||||||
fallocate -i -o 0 -l 1MiB $@
|
|
||||||
parted --script $@ mktable gpt
|
|
||||||
parted --script --align optimal $@ mkpart primary 1MiB 100%
|
|
||||||
|
|
||||||
xfs_v4_btrees_l2.img:
|
|
||||||
fallocate -l 127MiB $@
|
|
||||||
mkfs.xfs -b size=1k -m crc=0,finobt=0,rmapbt=0,reflink=0 -d sectsize=512 -i maxpct=100 -n size=4k,ftype=1 $@
|
|
||||||
sudo mount $(MOUNT_OPT) $@ $(TEMP_DIR)
|
|
||||||
sudo chown $$USER $(TEMP_DIR) -R
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/dir_btree_l2
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/dir_btree_l2 0 193181 214 30
|
|
||||||
#
|
|
||||||
fallocate -l 4KiB $(TEMP_DIR)/file_btree_l2
|
|
||||||
for n in $$(seq 1 4000); do \
|
|
||||||
fallocate -i -l 4KiB -o 0KiB $(TEMP_DIR)/file_btree_l2 ; \
|
|
||||||
fallocate -z -l 4KiB -o 0KiB $(TEMP_DIR)/file_btree_l2 ; \
|
|
||||||
done
|
|
||||||
$(MKFILEPATTERN) $(TEMP_DIR)/file_btree_l2 0 16388096
|
|
||||||
#
|
|
||||||
sudo umount $(TEMP_DIR)
|
|
||||||
fallocate -i -o 0 -l 1MiB $@
|
|
||||||
parted --script $@ mktable gpt
|
|
||||||
parted --script --align optimal $@ mkpart primary 1MiB 100%
|
|
||||||
|
|
||||||
xfs_v4_files_s05k_b4k_n8k.img:
|
|
||||||
fallocate -l 127MiB $@
|
|
||||||
mkfs.xfs -b size=4k -m crc=0,finobt=0,rmapbt=0,reflink=0 -d sectsize=512 -n size=8k,ftype=0 $@
|
|
||||||
sudo mount $(MOUNT_OPT) $@ $(TEMP_DIR)
|
|
||||||
sudo chown $$USER $(TEMP_DIR) -R
|
|
||||||
#
|
|
||||||
$(MKFILEPATTERN) $(TEMP_DIR)/no_hole 0 65536
|
|
||||||
#
|
|
||||||
$(MKFILEPATTERN) $(TEMP_DIR)/hole_begin 0 65536
|
|
||||||
fallocate -p -o 0 -l 16KiB $(TEMP_DIR)/hole_begin
|
|
||||||
#
|
|
||||||
$(MKFILEPATTERN) $(TEMP_DIR)/hole_middle 0 65536
|
|
||||||
fallocate -p -o 32KiB -l 16KiB $(TEMP_DIR)/hole_middle
|
|
||||||
#
|
|
||||||
$(MKFILEPATTERN) $(TEMP_DIR)/hole_end 0 65536
|
|
||||||
fallocate -p -o 48KiB -l 16KiB $(TEMP_DIR)/hole_end
|
|
||||||
#
|
|
||||||
fallocate -l 4KiB $(TEMP_DIR)/btree_l1_no_hole
|
|
||||||
for n in $$(seq 1 2000); do \
|
|
||||||
fallocate -i -l 4KiB -o 0KiB $(TEMP_DIR)/btree_l1_no_hole ; \
|
|
||||||
fallocate -z -l 4KiB -o 0KiB $(TEMP_DIR)/btree_l1_no_hole ; \
|
|
||||||
done
|
|
||||||
$(MKFILEPATTERN) $(TEMP_DIR)/btree_l1_no_hole 0 8196096
|
|
||||||
#
|
|
||||||
# fallocate -l 5GiB $(TEMP_DIR)/4GiB_plus
|
|
||||||
$(MKFILEPATTERN) $(TEMP_DIR)/4GiB_plus 0x120008000 0x1000
|
|
||||||
$(MKFILEPATTERN) $(TEMP_DIR)/4GiB_plus 0x120000000 0x4000
|
|
||||||
$(MKFILEPATTERN) $(TEMP_DIR)/4GiB_plus 0xffffe000 0x4000
|
|
||||||
$(MKFILEPATTERN) $(TEMP_DIR)/4GiB_plus 0x4000 0x4000
|
|
||||||
#
|
|
||||||
sudo umount $(TEMP_DIR)
|
|
||||||
fallocate -i -o 0 -l 1MiB $@
|
|
||||||
parted --script $@ mktable gpt
|
|
||||||
parted --script --align optimal $@ mkpart primary 1MiB 100%
|
|
||||||
|
|
||||||
xfs_v4_ftype0_s4k_b4k_n8k.img:
|
|
||||||
fallocate -l 63MiB $@
|
|
||||||
mkfs.xfs -b size=4k -m crc=0,finobt=0,rmapbt=0,reflink=0 -d sectsize=4k -i maxpct=100 -n size=8k,ftype=0 $@
|
|
||||||
sudo mount $(MOUNT_OPT) $@ $(TEMP_DIR)
|
|
||||||
sudo chown $$USER $(TEMP_DIR) -R
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/sf_empty
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/sf
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/sf 0 3 0 244
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/block
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/block 0 5 234 10
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/leaf
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/leaf 0 40 214 30
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/node
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/node 0 1100 0 23
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/btree_leaf
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/btree_leaf 0 1000 201 43
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/btree_leaf_free
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/btree_leaf_free 0 1200 201 43
|
|
||||||
#
|
|
||||||
sudo umount $(TEMP_DIR)
|
|
||||||
fallocate -i -o 0 -l 1MiB $@
|
|
||||||
sudo losetup -b 4096 /dev/loop8 $@
|
|
||||||
sudo parted --script /dev/loop8 mktable gpt
|
|
||||||
sudo parted --script --align optimal /dev/loop8 mkpart primary 1MiB 100%
|
|
||||||
sudo losetup -d /dev/loop8
|
|
||||||
# parted --script $@ mktable gpt
|
|
||||||
# parted --script --align optimal $@ mkpart primary 1MiB 100%
|
|
||||||
|
|
||||||
xfs_v4_ftype0_s05k_b2k_n8k_xattr.img:
|
|
||||||
fallocate -l 63MiB $@
|
|
||||||
mkfs.xfs -b size=2k -m crc=0,finobt=0,rmapbt=0,reflink=0 -d sectsize=512 -i maxpct=100 -n size=8k,ftype=0 $@
|
|
||||||
sudo mount $(MOUNT_OPT) $@ $(TEMP_DIR)
|
|
||||||
sudo chown $$USER $(TEMP_DIR) -R
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/sf_empty
|
|
||||||
setfattr -n user.pew_attr_pew -v pew_value_pew $(TEMP_DIR)/sf_empty
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/sf
|
|
||||||
setfattr -n user.pew_attr_pew -v pew_value_pew $(TEMP_DIR)/sf
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/sf 0 3 0 244
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/block
|
|
||||||
setfattr -n user.pew_attr_pew -v pew_value_pew $(TEMP_DIR)/block
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/block 0 5 234 10
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/leaf
|
|
||||||
setfattr -n user.pew_attr_pew -v pew_value_pew $(TEMP_DIR)/leaf
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/leaf 0 40 214 30
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/node
|
|
||||||
setfattr -n user.pew_attr_pew -v pew_value_pew $(TEMP_DIR)/node
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/node 0 1020 0 23
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/btree_leaf
|
|
||||||
setfattr -n user.pew_attr_pew -v pew_value_pew $(TEMP_DIR)/btree_leaf
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/btree_leaf 0 1000 201 43
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/btree_leaf_free
|
|
||||||
setfattr -n user.pew_attr_pew -v pew_value_pew $(TEMP_DIR)/btree_leaf_free
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/btree_leaf_free 0 1200 201 43
|
|
||||||
#
|
|
||||||
sudo umount $(TEMP_DIR)
|
|
||||||
fallocate -i -o 0 -l 1MiB $@
|
|
||||||
parted --script $@ mktable gpt
|
|
||||||
parted --script --align optimal $@ mkpart primary 1MiB 100%
|
|
||||||
|
|
||||||
xfs_v4_unicode.img:
|
|
||||||
fallocate -l 63MiB $@
|
|
||||||
mkfs.xfs -m crc=0,finobt=0,rmapbt=0,reflink=0 $@
|
|
||||||
sudo mount $(MOUNT_OPT) $@ $(TEMP_DIR)
|
|
||||||
sudo chown $$USER $(TEMP_DIR) -R
|
|
||||||
#
|
|
||||||
mkdir -p $(TEMP_DIR)/dir0
|
|
||||||
mkdir -p $(TEMP_DIR)/дир❦/дир11
|
|
||||||
mkdir -p $(TEMP_DIR)/❦❦❦/д❦р22
|
|
||||||
mkdir -p $(TEMP_DIR)/❦👩❦/
|
|
||||||
mkdir -p $(TEMP_DIR)/❦👩❦/👩❦❦/
|
|
||||||
mkdir -p $(TEMP_DIR)/❦👩❦/❦👩❦/
|
|
||||||
mkdir -p $(TEMP_DIR)/❦👩❦/❦❦👩/
|
|
||||||
mkdir $(TEMP_DIR)/дир3/
|
|
||||||
#
|
|
||||||
echo hello_world > $(TEMP_DIR)/dir0/file00
|
|
||||||
echo привет❦мир > $(TEMP_DIR)/❦❦❦/д❦р22/❦❦
|
|
||||||
echo привет💗мир > $(TEMP_DIR)/❦❦❦/д❦р22/💗💗
|
|
||||||
echo привет❦💗мир > $(TEMP_DIR)/дир3/файл33
|
|
||||||
#
|
|
||||||
sudo umount $(TEMP_DIR)
|
|
||||||
fallocate -i -o 0 -l 1MiB $@
|
|
||||||
parted --script $@ mktable gpt
|
|
||||||
parted --script --align optimal $@ mkpart primary 1MiB 100%
|
|
||||||
|
|
||||||
xfs_v5_ftype1_s05k_b2k_n8k.img:
|
|
||||||
fallocate -l 63MiB $@
|
|
||||||
mkfs.xfs -b size=2k -m crc=1,finobt=0,rmapbt=0,reflink=0 -d sectsize=512 -i maxpct=100 -n size=8k,ftype=1 $@
|
|
||||||
sudo mount $(MOUNT_OPT) $@ $(TEMP_DIR)
|
|
||||||
sudo chown $$USER $(TEMP_DIR) -R
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/sf_empty
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/sf
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/sf 0 3 0 244
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/block
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/block 0 5 234 10
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/leaf
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/leaf 0 40 214 30
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/node
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/node 0 1100 0 23
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/btree_leaf
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/btree_leaf 0 1000 201 43
|
|
||||||
#
|
|
||||||
mkdir $(TEMP_DIR)/btree_leaf_free
|
|
||||||
$(MKDIRRANGE) $(TEMP_DIR)/btree_leaf_free 0 1200 201 43
|
|
||||||
#
|
|
||||||
sudo umount $(TEMP_DIR)
|
|
||||||
fallocate -i -o 0 -l 1MiB $@
|
|
||||||
parted --script $@ mktable gpt
|
|
||||||
parted --script --align optimal $@ mkpart primary 1MiB 100%
|
|
||||||
|
|
||||||
xfs_v5_files_s05k_b4k_n8k.img:
|
|
||||||
fallocate -l 127MiB $@
|
|
||||||
mkfs.xfs -b size=4k -m crc=1,finobt=0,rmapbt=0,reflink=0 -d sectsize=512 -n size=8k,ftype=1 $@
|
|
||||||
sudo mount $(MOUNT_OPT) $@ $(TEMP_DIR)
|
|
||||||
sudo chown $$USER $(TEMP_DIR) -R
|
|
||||||
#
|
|
||||||
$(MKFILEPATTERN) $(TEMP_DIR)/no_hole 0 65536
|
|
||||||
#
|
|
||||||
$(MKFILEPATTERN) $(TEMP_DIR)/hole_begin 0 65536
|
|
||||||
fallocate -p -o 0 -l 16KiB $(TEMP_DIR)/hole_begin
|
|
||||||
#
|
|
||||||
$(MKFILEPATTERN) $(TEMP_DIR)/hole_middle 0 65536
|
|
||||||
fallocate -p -o 32KiB -l 16KiB $(TEMP_DIR)/hole_middle
|
|
||||||
#
|
|
||||||
$(MKFILEPATTERN) $(TEMP_DIR)/hole_end 0 65536
|
|
||||||
fallocate -p -o 48KiB -l 16KiB $(TEMP_DIR)/hole_end
|
|
||||||
#
|
|
||||||
fallocate -l 4KiB $(TEMP_DIR)/btree_l1_no_hole
|
|
||||||
for n in $$(seq 1 2000); do \
|
|
||||||
fallocate -i -l 4KiB -o 0KiB $(TEMP_DIR)/btree_l1_no_hole ; \
|
|
||||||
fallocate -z -l 4KiB -o 0KiB $(TEMP_DIR)/btree_l1_no_hole ; \
|
|
||||||
done
|
|
||||||
$(MKFILEPATTERN) $(TEMP_DIR)/btree_l1_no_hole 0 8196096
|
|
||||||
#
|
|
||||||
sudo umount $(TEMP_DIR)
|
|
||||||
fallocate -i -o 0 -l 1MiB $@
|
|
||||||
parted --script $@ mktable gpt
|
|
||||||
parted --script --align optimal $@ mkpart primary 1MiB 100%
|
|
||||||
|
|
||||||
|
|
@ -1,15 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
import sys
|
|
||||||
|
|
||||||
indent = b""
|
|
||||||
|
|
||||||
with open(sys.argv[1], 'rb') as fin:
|
|
||||||
with open(sys.argv[2], 'wb') as fout:
|
|
||||||
for line in fin:
|
|
||||||
if line.endswith(b"end\r\n"):
|
|
||||||
indent = indent[:-2]
|
|
||||||
fout.write(indent)
|
|
||||||
fout.write(line)
|
|
||||||
if line.endswith(b"begin\r\n"):
|
|
||||||
indent = indent + b" "
|
|
@ -1,30 +0,0 @@
|
|||||||
#include <errno.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <inttypes.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include "pci.h"
|
|
||||||
|
|
||||||
char pci_path[PATH_MAX] = ".";
|
|
||||||
|
|
||||||
__attribute__((stdcall)) uint32_t pci_read(uint32_t bus, uint32_t dev,
|
|
||||||
uint32_t fun, uint32_t offset,
|
|
||||||
size_t len) {
|
|
||||||
char path[PATH_MAX*2];
|
|
||||||
uint32_t value = 0;
|
|
||||||
sprintf(path, "%s/%4.4x:%2.2x:%2.2x.%u/config", pci_path, 0, bus, dev, fun);
|
|
||||||
int fd = open(path, O_RDONLY);
|
|
||||||
if (fd == -1) {
|
|
||||||
// fprintf(stderr, "[pci] error: failed to open config file '%s': %s\n",
|
|
||||||
// path, strerror(errno));
|
|
||||||
return UINT32_MAX;
|
|
||||||
}
|
|
||||||
lseek(fd, offset, SEEK_SET);
|
|
||||||
read(fd, &value, len);
|
|
||||||
close(fd);
|
|
||||||
return value;
|
|
||||||
}
|
|
@ -1,8 +0,0 @@
|
|||||||
#ifndef PCI_H_INCLUDED
|
|
||||||
#define PCI_H_INCLUDED
|
|
||||||
|
|
||||||
#include <limits.h>
|
|
||||||
|
|
||||||
extern char pci_path[PATH_MAX];
|
|
||||||
|
|
||||||
#endif // PCI_H_INCLUDED
|
|
@ -1,17 +0,0 @@
|
|||||||
#include <setjmp.h>
|
|
||||||
#define __USE_GNU
|
|
||||||
#include <signal.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
sigset_t mask;
|
|
||||||
|
|
||||||
void reset_procmask(void) {
|
|
||||||
sigemptyset (&mask);
|
|
||||||
sigaddset (&mask, SIGPROF);
|
|
||||||
sigprocmask(SIG_UNBLOCK, &mask, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
int get_fake_if(ucontext_t *ctx) {
|
|
||||||
// we fake IF with id flag
|
|
||||||
return !(ctx->uc_mcontext.__gregs[REG_EFL] & (1 << 21));
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,96 +0,0 @@
|
|||||||
FASM=fasm -dUEFI=1 -dextended_primary_loader=1 -dUMKA=1
|
|
||||||
CC=gcc
|
|
||||||
WARNINGS=-Wall -Wextra -Wduplicated-cond -Wduplicated-branches -Wlogical-op \
|
|
||||||
-Wrestrict -Wnull-dereference -Wjump-misses-init -Wshadow -Wformat=2 \
|
|
||||||
-Wswitch -Wswitch-enum -Wpedantic \
|
|
||||||
#-Wconversion -Wsign-conversion
|
|
||||||
NOWARNINGS=-Wno-address-of-packed-member
|
|
||||||
CFLAGS=$(WARNINGS) $(NOWARNINGS) -std=c11 -g -O0 -D_FILE_OFFSET_BITS=64 \
|
|
||||||
-DNDEBUG -masm=intel -D_POSIX_C_SOURCE=200809L -Ilinux -fno-pie
|
|
||||||
CFLAGS_32=$(CFLAGS) -m32
|
|
||||||
LDFLAGS=-no-pie
|
|
||||||
LDFLAGS_32=$(LDFLAGS) -m32
|
|
||||||
|
|
||||||
all: umka_shell umka_fuse umka_os umka.sym umka.prp \
|
|
||||||
umka.lst tags covpreproc default.skn skin.skn
|
|
||||||
|
|
||||||
covpreproc: covpreproc.c
|
|
||||||
$(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@
|
|
||||||
|
|
||||||
umka_shell: umka_shell.o umka.o shell.o trace.o trace_lbr.o vdisk.o vnet.o \
|
|
||||||
lodepng.o pci.o thread.o util.o
|
|
||||||
$(CC) $(LDFLAGS_32) $^ -o $@ -static -T umka.ld
|
|
||||||
|
|
||||||
umka_fuse: umka_fuse.o umka.o trace.o trace_lbr.o vdisk.o pci.o thread.o
|
|
||||||
$(CC) $(LDFLAGS_32) $^ -o $@ `pkg-config fuse3 --libs` -T umka.ld
|
|
||||||
|
|
||||||
umka_os: umka_os.o umka.o shell.o lodepng.o vdisk.o vnet.o trace.o trace_lbr.o \
|
|
||||||
pci.o thread.o umka_ping.o util.o
|
|
||||||
$(CC) $(LDFLAGS_32) $^ -o $@ -static -T umka.ld
|
|
||||||
|
|
||||||
umka.o umka.fas: umka.asm
|
|
||||||
INCLUDE="$(KOLIBRIOS)/kernel/trunk;$(KOLIBRIOS)/programs/develop/libraries/libcrash/hash" \
|
|
||||||
$(FASM) $< umka.o -s umka.fas -m 2000000
|
|
||||||
|
|
||||||
shell.o: shell.c
|
|
||||||
$(CC) $(CFLAGS_32) -c $<
|
|
||||||
|
|
||||||
thread.o: linux/thread.c
|
|
||||||
$(CC) $(CFLAGS_32) -c $<
|
|
||||||
|
|
||||||
pci.o: linux/pci.c
|
|
||||||
$(CC) $(CFLAGS_32) -c $<
|
|
||||||
|
|
||||||
lodepng.o: lodepng.c lodepng.h
|
|
||||||
$(CC) $(CFLAGS_32) -c $<
|
|
||||||
|
|
||||||
util.o: util.c util.h umka.h
|
|
||||||
$(CC) $(CFLAGS_32) -c $<
|
|
||||||
|
|
||||||
default.skn: $(KOLIBRIOS)/skins/Leency/Shkvorka/default.asm
|
|
||||||
$(FASM) $< $@
|
|
||||||
|
|
||||||
skin.skn: $(KOLIBRIOS)/skins/Leency/Octo_flat/default.asm
|
|
||||||
$(FASM) $< $@
|
|
||||||
|
|
||||||
umka.prp: umka.fas
|
|
||||||
prepsrc $< $@
|
|
||||||
|
|
||||||
umka.sym: umka.fas
|
|
||||||
symbols $< $@
|
|
||||||
|
|
||||||
umka.lst: umka.fas
|
|
||||||
listing $< $@
|
|
||||||
|
|
||||||
tags: umka.sym
|
|
||||||
fasmtags.py $<
|
|
||||||
|
|
||||||
trace.o: trace.c trace.h trace_lbr.h
|
|
||||||
$(CC) $(CFLAGS_32) -c $<
|
|
||||||
|
|
||||||
trace_lbr.o: trace_lbr.c trace_lbr.h umka.h
|
|
||||||
$(CC) $(CFLAGS_32) -c $<
|
|
||||||
|
|
||||||
vdisk.o: vdisk.c
|
|
||||||
$(CC) $(CFLAGS_32) -c $<
|
|
||||||
|
|
||||||
vnet.o: vnet.c
|
|
||||||
$(CC) $(CFLAGS_32) -c $<
|
|
||||||
|
|
||||||
umka_shell.o: umka_shell.c umka.h trace.h
|
|
||||||
$(CC) $(CFLAGS_32) -c $<
|
|
||||||
|
|
||||||
umka_fuse.o: umka_fuse.c umka.h
|
|
||||||
$(CC) $(CFLAGS_32) `pkg-config fuse3 --cflags` -c $<
|
|
||||||
|
|
||||||
umka_os.o: umka_os.c umka.h
|
|
||||||
$(CC) $(CFLAGS_32) -c $< -D_XOPEN_SOURCE=600
|
|
||||||
|
|
||||||
umka_ping.o: umka_ping.c umka.h
|
|
||||||
$(CC) $(CFLAGS_32) -D_DEFAULT_SOURCE -c $<
|
|
||||||
|
|
||||||
.PHONY: all clean
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f *.o umka_shell umka_fuse umka_os umka.fas \
|
|
||||||
umka.sym umka.lst umka.prp coverage
|
|
File diff suppressed because it is too large
Load Diff
@ -1,8 +0,0 @@
|
|||||||
#ifndef SHELL_H_INCLUDED
|
|
||||||
#define SHELL_H_INCLUDED
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
void *run_test(FILE *in, FILE *out);
|
|
||||||
|
|
||||||
#endif // SHELL_H_INCLUDED
|
|
Binary file not shown.
@ -1,22 +0,0 @@
|
|||||||
SYS_EXIT = 1
|
|
||||||
SYS_READ = 3
|
|
||||||
SYS_WRITE = 4
|
|
||||||
SYS_OPEN = 5
|
|
||||||
SYS_CLOSE = 6
|
|
||||||
;SYS_LSEEK = 19
|
|
||||||
SYS_LLSEEK = 140
|
|
||||||
|
|
||||||
SEEK_SET = 0
|
|
||||||
SEEK_CUR = 1
|
|
||||||
SEEK_END = 2
|
|
||||||
|
|
||||||
O_RDONLY = 0
|
|
||||||
O_LARGEFILE = 0x8000
|
|
||||||
|
|
||||||
STDIN = 0
|
|
||||||
STDOUT = 1
|
|
||||||
STDERR = 2
|
|
||||||
|
|
||||||
ENOENT = 2
|
|
||||||
|
|
||||||
SIGPROF = 27
|
|
@ -1,119 +0,0 @@
|
|||||||
/> umka_init
|
|
||||||
#disk_add ../img/kolibri.img rd -c 0
|
|
||||||
/> ramdisk_init ../img/kolibri.img
|
|
||||||
/rd/1: fat
|
|
||||||
/> set_skin /sys/DEFAULT.SKN
|
|
||||||
status: 0
|
|
||||||
/> window_redraw 1
|
|
||||||
/> draw_window 10 300 5 200 0x000088 1 1 1 0 1 4 hello
|
|
||||||
/> set_pixel 0 0 0x0000ff
|
|
||||||
/> set_pixel 1 1 0xff0000
|
|
||||||
/> set_pixel 2 2 0x00ff00
|
|
||||||
/> draw_line 10 510 10 510 0xff0000
|
|
||||||
/> draw_rect 60 20 30 20 0x00ff00
|
|
||||||
/> put_image chess_image.rgb 8 8 5 15
|
|
||||||
/> put_image_palette chess_image.rgb 12 12 5 30 9 0
|
|
||||||
/> write_text 10 70 0xffff00 hello 0 0 0 0 0 5 0
|
|
||||||
/> set_button_style 0
|
|
||||||
/> button 55 40 5 20 0xc0ffee 0xffffff 1 0
|
|
||||||
/> set_button_style 1
|
|
||||||
/> button 100 40 5 20 0xc1ffee 0xffffff 1 0
|
|
||||||
/> display_number 0 10 4 0 0 1234 5 45 0xffff00 1 1 0 0 0x0000ff
|
|
||||||
/> blit_bitmap chess_image.rgba 20 35 8 8 0 0 8 8 0 0 0 1 32
|
|
||||||
/> window_redraw 2
|
|
||||||
|
|
||||||
/> set_window_caption hi_there 0
|
|
||||||
|
|
||||||
/> get_font_smoothing
|
|
||||||
font smoothing: 2 - subpixel
|
|
||||||
/> set_font_smoothing 0
|
|
||||||
/> get_font_smoothing
|
|
||||||
font smoothing: 0 - off
|
|
||||||
|
|
||||||
/> get_window_colors
|
|
||||||
0x00586786 frame
|
|
||||||
0x00fefefe grab
|
|
||||||
0x00c5bdb9 work_3d_dark
|
|
||||||
0x00ece9e5 work_3d_light
|
|
||||||
0x00333333 grab_text
|
|
||||||
0x00ddd7cf work
|
|
||||||
0x007887a6 work_button
|
|
||||||
0x00fefefe work_button_text
|
|
||||||
0x00000000 work_text
|
|
||||||
0x007e7e7e work_graph
|
|
||||||
/> set_window_colors 0 0 0 0 0 0 0 0 0 0
|
|
||||||
|
|
||||||
/> dump_win_stack 2
|
|
||||||
0: 0
|
|
||||||
1: 1
|
|
||||||
/> dump_win_pos 2
|
|
||||||
0: 0
|
|
||||||
1: 1
|
|
||||||
/> dump_taskdata 2
|
|
||||||
event_mask: 0
|
|
||||||
pid: 2
|
|
||||||
state: 0x0
|
|
||||||
wnd_number: 2
|
|
||||||
counter_sum: 0
|
|
||||||
counter_add: 0
|
|
||||||
cpu_usage: 0
|
|
||||||
/> dump_appdata 2
|
|
||||||
app_name: OS
|
|
||||||
except_mask: 0
|
|
||||||
dbg_state: 0
|
|
||||||
cur_dir:
|
|
||||||
draw_bgr_x: 0
|
|
||||||
draw_bgr_y: 0
|
|
||||||
event_mask: 0
|
|
||||||
terminate_protection: 1
|
|
||||||
keyboard_mode: 0
|
|
||||||
captionEncoding: 0
|
|
||||||
exec_params: (null)
|
|
||||||
wnd_caption:
|
|
||||||
wnd_clientbox (ltwh): 5 24 291 172
|
|
||||||
priority: 0
|
|
||||||
in_schedule: prev (2), next (2)
|
|
||||||
|
|
||||||
/> process_info -1
|
|
||||||
cpu_usage: 0
|
|
||||||
window_stack_position: 2
|
|
||||||
window_stack_value: 2
|
|
||||||
process_name: OS
|
|
||||||
memory_start: 0x00000000
|
|
||||||
used_memory: 4294967295 (0xffffffff)
|
|
||||||
pid: 2
|
|
||||||
box: 10 5 300 200
|
|
||||||
slot_state: 0
|
|
||||||
client_box: 5 24 291 172
|
|
||||||
wnd_state: 0x00
|
|
||||||
/> get_skin_height
|
|
||||||
24
|
|
||||||
/> get_screen_area
|
|
||||||
0 left
|
|
||||||
0 top
|
|
||||||
399 right
|
|
||||||
299 bottom
|
|
||||||
/> set_screen_area 0 20 350 250
|
|
||||||
/> get_screen_area
|
|
||||||
0 left
|
|
||||||
20 top
|
|
||||||
350 right
|
|
||||||
250 bottom
|
|
||||||
/> get_skin_margins
|
|
||||||
6 left
|
|
||||||
5 top
|
|
||||||
65 right
|
|
||||||
3 bottom
|
|
||||||
|
|
||||||
/> get_font_size
|
|
||||||
0px
|
|
||||||
/> set_font_size 16
|
|
||||||
/> get_font_size
|
|
||||||
16px
|
|
||||||
|
|
||||||
/> get_screen_size
|
|
||||||
400x300
|
|
||||||
|
|
||||||
/> scrot 016_#f01_#draw_all.out.png
|
|
||||||
|
|
||||||
/> disk_del rd
|
|
Binary file not shown.
Before Width: | Height: | Size: 2.3 KiB |
@ -1,52 +0,0 @@
|
|||||||
umka_init
|
|
||||||
#disk_add ../img/kolibri.img rd -c 0
|
|
||||||
ramdisk_init ../img/kolibri.img
|
|
||||||
set_skin /sys/DEFAULT.SKN
|
|
||||||
window_redraw 1
|
|
||||||
draw_window 10 300 5 200 0x000088 1 1 1 0 1 4 hello
|
|
||||||
set_pixel 0 0 0x0000ff
|
|
||||||
set_pixel 1 1 0xff0000
|
|
||||||
set_pixel 2 2 0x00ff00
|
|
||||||
draw_line 10 510 10 510 0xff0000
|
|
||||||
draw_rect 60 20 30 20 0x00ff00
|
|
||||||
put_image chess_image.rgb 8 8 5 15
|
|
||||||
put_image_palette chess_image.rgb 12 12 5 30 9 0
|
|
||||||
write_text 10 70 0xffff00 hello 0 0 0 0 0 5 0
|
|
||||||
set_button_style 0
|
|
||||||
button 55 40 5 20 0xc0ffee 0xffffff 1 0
|
|
||||||
set_button_style 1
|
|
||||||
button 100 40 5 20 0xc1ffee 0xffffff 1 0
|
|
||||||
display_number 0 10 4 0 0 1234 5 45 0xffff00 1 1 0 0 0x0000ff
|
|
||||||
blit_bitmap chess_image.rgba 20 35 8 8 0 0 8 8 0 0 0 1 32
|
|
||||||
window_redraw 2
|
|
||||||
|
|
||||||
set_window_caption hi_there 0
|
|
||||||
|
|
||||||
get_font_smoothing
|
|
||||||
set_font_smoothing 0
|
|
||||||
get_font_smoothing
|
|
||||||
|
|
||||||
get_window_colors
|
|
||||||
set_window_colors 0 0 0 0 0 0 0 0 0 0
|
|
||||||
|
|
||||||
dump_win_stack 2
|
|
||||||
dump_win_pos 2
|
|
||||||
dump_taskdata 2
|
|
||||||
dump_appdata 2
|
|
||||||
|
|
||||||
process_info -1
|
|
||||||
get_skin_height
|
|
||||||
get_screen_area
|
|
||||||
set_screen_area 0 20 350 250
|
|
||||||
get_screen_area
|
|
||||||
get_skin_margins
|
|
||||||
|
|
||||||
get_font_size
|
|
||||||
set_font_size 16
|
|
||||||
get_font_size
|
|
||||||
|
|
||||||
get_screen_size
|
|
||||||
|
|
||||||
scrot 016_#f01_#draw_all.out.png
|
|
||||||
|
|
||||||
disk_del rd
|
|
@ -1,4 +0,0 @@
|
|||||||
/> umka_init
|
|
||||||
/> i40 18 16
|
|
||||||
eax = 00040000 262144 262144
|
|
||||||
ebx = 00000010 16 16
|
|
@ -1,2 +0,0 @@
|
|||||||
umka_init
|
|
||||||
i40 18 16
|
|
@ -1,166 +0,0 @@
|
|||||||
/> umka_set_boot_params --x_res 44 --y_res 44
|
|
||||||
/> umka_init
|
|
||||||
/> ramdisk_init ../img/kolibri.img
|
|
||||||
/rd/1: fat
|
|
||||||
/> set_skin /sys/DEFAULT.SKN
|
|
||||||
status: 0
|
|
||||||
|
|
||||||
/> window_redraw 1
|
|
||||||
/> draw_window 2 10 4 10 0x000088 1 1 1 0 1 4 hello
|
|
||||||
/> window_redraw 2
|
|
||||||
|
|
||||||
/> set_window_caption hi_there 0
|
|
||||||
|
|
||||||
/> new_sys_thread
|
|
||||||
tid: 3
|
|
||||||
/> switch_to_thread 3
|
|
||||||
|
|
||||||
/> window_redraw 1
|
|
||||||
/> draw_window 4 5 8 5 0x000088 1 1 1 0 1 4 hello
|
|
||||||
/> window_redraw 2
|
|
||||||
|
|
||||||
/> dump_win_map
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11222222222221111111111111111111111111111111
|
|
||||||
11222222222221111111111111111111111111111111
|
|
||||||
11222222222221111111111111111111111111111111
|
|
||||||
11222222222221111111111111111111111111111111
|
|
||||||
11223333332221111111111111111111111111111111
|
|
||||||
11223333332221111111111111111111111111111111
|
|
||||||
11223333332221111111111111111111111111111111
|
|
||||||
11223333332221111111111111111111111111111111
|
|
||||||
11223333332221111111111111111111111111111111
|
|
||||||
11223333332221111111111111111111111111111111
|
|
||||||
11222222222221111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
|
|
||||||
/> set redraw_background 0
|
|
||||||
/> move_window 6 8 5 5
|
|
||||||
/> dump_win_map
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11222222222221111111111111111111111111111111
|
|
||||||
11222222222221111111111111111111111111111111
|
|
||||||
11222222222221111111111111111111111111111111
|
|
||||||
11222222222221111111111111111111111111111111
|
|
||||||
11222233333321111111111111111111111111111111
|
|
||||||
11222233333321111111111111111111111111111111
|
|
||||||
11222233333321111111111111111111111111111111
|
|
||||||
11222233333321111111111111111111111111111111
|
|
||||||
11222233333321111111111111111111111111111111
|
|
||||||
11222233333321111111111111111111111111111111
|
|
||||||
11222222222221111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
|
|
||||||
/> set redraw_background 0
|
|
||||||
/> move_window 6 10 5 5
|
|
||||||
/> dump_win_map
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11222222222221111111111111111111111111111111
|
|
||||||
11222222222221111111111111111111111111111111
|
|
||||||
11222222222221111111111111111111111111111111
|
|
||||||
11222222222221111111111111111111111111111111
|
|
||||||
11222222222221111111111111111111111111111111
|
|
||||||
11222222222221111111111111111111111111111111
|
|
||||||
11222233333321111111111111111111111111111111
|
|
||||||
11222233333321111111111111111111111111111111
|
|
||||||
11222233333321111111111111111111111111111111
|
|
||||||
11222233333321111111111111111111111111111111
|
|
||||||
11222233333321111111111111111111111111111111
|
|
||||||
11111133333311111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
11111111111111111111111111111111111111111111
|
|
||||||
|
|
||||||
/> scrot 044_#f01_#draw_winmap.out.png
|
|
||||||
|
|
||||||
/> disk_del rd
|
|
Binary file not shown.
Before Width: | Height: | Size: 159 B |
@ -1,31 +0,0 @@
|
|||||||
umka_set_boot_params --x_res 44 --y_res 44
|
|
||||||
umka_init
|
|
||||||
ramdisk_init ../img/kolibri.img
|
|
||||||
set_skin /sys/DEFAULT.SKN
|
|
||||||
|
|
||||||
window_redraw 1
|
|
||||||
draw_window 2 10 4 10 0x000088 1 1 1 0 1 4 hello
|
|
||||||
window_redraw 2
|
|
||||||
|
|
||||||
set_window_caption hi_there 0
|
|
||||||
|
|
||||||
new_sys_thread
|
|
||||||
switch_to_thread 3
|
|
||||||
|
|
||||||
window_redraw 1
|
|
||||||
draw_window 4 5 8 5 0x000088 1 1 1 0 1 4 hello
|
|
||||||
window_redraw 2
|
|
||||||
|
|
||||||
dump_win_map
|
|
||||||
|
|
||||||
set redraw_background 0
|
|
||||||
move_window 6 8 5 5
|
|
||||||
dump_win_map
|
|
||||||
|
|
||||||
set redraw_background 0
|
|
||||||
move_window 6 10 5 5
|
|
||||||
dump_win_map
|
|
||||||
|
|
||||||
scrot 044_#f01_#draw_winmap.out.png
|
|
||||||
|
|
||||||
disk_del rd
|
|
Binary file not shown.
Binary file not shown.
@ -1,64 +0,0 @@
|
|||||||
ifndef COVERAGE
|
|
||||||
UMKA_SHELL=../umka_shell
|
|
||||||
else
|
|
||||||
UMKA_SHELL=sudo taskset 1 ../umka_shell -c
|
|
||||||
endif
|
|
||||||
|
|
||||||
xfs_tests := $(addsuffix .out.log, $(basename $(wildcard *\#xfs_*.t)))
|
|
||||||
s05k_tests := $(addsuffix .out.log, $(basename $(wildcard *\#s05k_*.t)))
|
|
||||||
s4k_tests := $(addsuffix .out.log, $(basename $(wildcard *\#s4k_*.t)))
|
|
||||||
f30_tests := $(addsuffix .out.log, $(basename $(wildcard *\#f30_*.t)))
|
|
||||||
f70_tests := $(addsuffix .out.log, $(basename $(wildcard *\#f70_*.t)))
|
|
||||||
f70s0_tests := $(addsuffix .out.log, $(basename $(wildcard *\#f70s0_*.t)))
|
|
||||||
f70s1_tests := $(addsuffix .out.log, $(basename $(wildcard *\#f70s1_*.t)))
|
|
||||||
f70s5_tests := $(addsuffix .out.log, $(basename $(wildcard *\#f70s5_*.t)))
|
|
||||||
lookup_tests := $(addsuffix .out.log, $(basename $(wildcard *\#lookup_*.t)))
|
|
||||||
bug_tests := $(addsuffix .out.log, $(basename $(wildcard *\#bug_*.t)))
|
|
||||||
xattr_tests := $(addsuffix .out.log, $(basename $(wildcard *\#xattr_*.t)))
|
|
||||||
unicode_tests := $(addsuffix .out.log, $(basename $(wildcard *\#unicode_*.t)))
|
|
||||||
v5_tests := $(addsuffix .out.log, $(basename $(wildcard *\#v5_*.t)))
|
|
||||||
draw_tests := $(addsuffix .out.log, $(basename $(wildcard *\#draw_*.t)))
|
|
||||||
coverage_tests := $(addsuffix .out.log, $(basename $(wildcard *\#coverage_*.t)))
|
|
||||||
i40_tests := $(addsuffix .out.log, $(basename $(wildcard *\#i40_*.t)))
|
|
||||||
net_tests := $(addsuffix .out.log, $(basename $(wildcard *\#net_*.t)))
|
|
||||||
arp_tests := $(addsuffix .out.log, $(basename $(wildcard *\#arp_*.t)))
|
|
||||||
acpi_tests := $(addsuffix .out.log, $(basename $(wildcard *\#acpi_*.t)))
|
|
||||||
|
|
||||||
all: xfs s05k s4k f30 f70 f70s0 f70s1 f70s5 lookup bug xattr unicode v5 draw coverage i40 net arp acpi
|
|
||||||
@echo all tests passed
|
|
||||||
|
|
||||||
xfs: $(xfs_tests)
|
|
||||||
s05k: $(s05k_tests)
|
|
||||||
s4k: $(s4k_tests)
|
|
||||||
f30: $(f30_tests)
|
|
||||||
f70: $(f70_tests)
|
|
||||||
f70s0: $(f70s0_tests)
|
|
||||||
f70s1: $(f70s1_tests)
|
|
||||||
f70s5: $(f70s5_tests)
|
|
||||||
lookup: $(lookup_tests)
|
|
||||||
bug: $(bug_tests)
|
|
||||||
xattr: $(xattr_tests)
|
|
||||||
unicode: $(unicode_tests)
|
|
||||||
v5: $(v5_tests)
|
|
||||||
draw: $(draw_tests)
|
|
||||||
coverage: $(coverage_tests)
|
|
||||||
i40: $(i40_tests)
|
|
||||||
net: $(net_tests)
|
|
||||||
arp: $(arp_tests)
|
|
||||||
acpi: $(acpi_tests)
|
|
||||||
|
|
||||||
%.out.log: %.t
|
|
||||||
$(UMKA_SHELL) < $*.t > $@
|
|
||||||
@ cmp $*.{out,ref}.log
|
|
||||||
@ if [ -f "$*.ref.png" ]; then cmp $*.{out,ref}.png; fi
|
|
||||||
|
|
||||||
collect_coverage:
|
|
||||||
../covpreproc ../umka.lst 0x34 coverage.* > ../umka.cov
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f ???_*.out.{log,png} coverage.*
|
|
||||||
|
|
||||||
update_logs:
|
|
||||||
for f in *ref.log; do cp $$(basename $$f .ref.log).out.log $$f; done
|
|
||||||
|
|
||||||
.PHONY: clean collect_coverage update_logs
|
|
@ -1,81 +0,0 @@
|
|||||||
#include <inttypes.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/uio.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <X11/Xlib.h>
|
|
||||||
#include <X11/Xutil.h>
|
|
||||||
#include <X11/XKBlib.h>
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
|
||||||
if (argc != 5) {
|
|
||||||
printf("usage: lfbviewx <pid> <address> <width> <height>\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
int depth = 32;
|
|
||||||
int umka_pid = strtol(argv[1], NULL, 0);
|
|
||||||
uintptr_t umka_lfb_addr = strtol(argv[2], NULL, 0);
|
|
||||||
size_t lfb_width = strtoul(argv[3], NULL, 0);
|
|
||||||
size_t lfb_height = strtoul(argv[4], NULL, 0);
|
|
||||||
|
|
||||||
Display *display = XOpenDisplay(NULL);
|
|
||||||
int screen_num = XDefaultScreen(display);
|
|
||||||
Window root = XDefaultRootWindow(display);
|
|
||||||
|
|
||||||
XVisualInfo vis_info;
|
|
||||||
if(!XMatchVisualInfo(display, screen_num, depth, TrueColor, &vis_info)) {
|
|
||||||
fprintf(stderr, "ERR: %d-bit depth is not supported\n", depth);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
Visual *visual = vis_info.visual;
|
|
||||||
XSetWindowAttributes win_attr = {
|
|
||||||
.colormap = XCreateColormap(display, root, visual, AllocNone),
|
|
||||||
.background_pixel = 0,
|
|
||||||
.border_pixel = 0};
|
|
||||||
unsigned long win_mask = CWBackPixel | CWColormap | CWBorderPixel;
|
|
||||||
Window window = XCreateWindow(display, root, 0, 0, lfb_width, lfb_height, 0, depth, InputOutput, visual, win_mask, &win_attr);
|
|
||||||
GC gc = XCreateGC(display, window, 0, 0);
|
|
||||||
|
|
||||||
uint32_t *lfb = (uint32_t*)malloc(lfb_width*lfb_height*sizeof(uint32_t));
|
|
||||||
XImage *image = XCreateImage(display, visual, depth, ZPixmap, 0, (char*)lfb, lfb_width, lfb_height, 32, 0);
|
|
||||||
|
|
||||||
XSelectInput(display, window, ExposureMask | KeyPressMask);
|
|
||||||
XStoreName(display, window, "KolibriOS LFB Viewer for X");
|
|
||||||
XMapWindow(display, window);
|
|
||||||
|
|
||||||
|
|
||||||
struct iovec remote = {.iov_base = (void*)umka_lfb_addr,
|
|
||||||
.iov_len = lfb_width*lfb_height*4};
|
|
||||||
struct iovec local = {.iov_base = lfb,
|
|
||||||
.iov_len = lfb_width*lfb_height*4};
|
|
||||||
/*
|
|
||||||
XEvent event;
|
|
||||||
while (true) {
|
|
||||||
XNextEvent(display, &event);
|
|
||||||
if (event.type == Expose) {
|
|
||||||
process_vm_readv(umka_pid, &local, 1, &remote, 1, 0);
|
|
||||||
XPutImage(display, window, gc, image, 0, 0, 0, 0, lfb_width, lfb_height);
|
|
||||||
} else if (event.type == KeyPress) {
|
|
||||||
int keysym = XkbKeycodeToKeysym(display, event. xkey.keycode, 0, 0);
|
|
||||||
|
|
||||||
if (keysym == XK_Escape) break;
|
|
||||||
switch (keysym) {
|
|
||||||
case XK_Left: {break;}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
XEvent event;
|
|
||||||
while (true) {
|
|
||||||
while (XCheckMaskEvent(display, (long)-1, &event)) { /* skip */ }
|
|
||||||
process_vm_readv(umka_pid, &local, 1, &remote, 1, 0);
|
|
||||||
XPutImage(display, window, gc, image, 0, 0, 0, 0, lfb_width, lfb_height);
|
|
||||||
sleep(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
XCloseDisplay(display);
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,24 +0,0 @@
|
|||||||
CC=gcc
|
|
||||||
WARNINGS=-Wall -Wextra -Wduplicated-cond -Wduplicated-branches -Wlogical-op \
|
|
||||||
-Wrestrict -Wnull-dereference -Wjump-misses-init -Wshadow -Wformat=2 \
|
|
||||||
-Wswitch -Wswitch-enum -Wpedantic
|
|
||||||
NOWARNINGS=-Wno-address-of-packed-member
|
|
||||||
CFLAGS=$(WARNINGS) $(NOWARNINGS) -std=c11 -O2 \
|
|
||||||
-DNDEBUG -D_POSIX_C_SOURCE=200809L -fno-pie
|
|
||||||
LDFLAGS=-no-pie
|
|
||||||
|
|
||||||
all: mkdirrange mkfilepattern lfbviewx
|
|
||||||
|
|
||||||
mkdirrange: mkdirrange.c
|
|
||||||
$(CC) $(CFLAGS) $(LDFLAGS) $< -o $@
|
|
||||||
|
|
||||||
mkfilepattern: mkfilepattern.c
|
|
||||||
$(CC) $(CFLAGS) $(LDFLAGS) $< -o $@
|
|
||||||
|
|
||||||
lfbviewx: lfbviewx.c
|
|
||||||
$(CC) $(CFLAGS) $(LDFLAGS) $< -o $@ -lX11 -lXext -D_GNU_SOURCE
|
|
||||||
|
|
||||||
.PHONY: all clean
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f *.o mkdirrange mkfilepattern lfbviewx
|
|
@ -1,48 +0,0 @@
|
|||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
unsigned begin, end;
|
|
||||||
int pat_min, pat_max;
|
|
||||||
char *path;
|
|
||||||
if (argc == 6) {
|
|
||||||
path = argv[1];
|
|
||||||
sscanf(argv[2], "%u", &begin);
|
|
||||||
sscanf(argv[3], "%u", &end);
|
|
||||||
sscanf(argv[4], "%i", &pat_min);
|
|
||||||
sscanf(argv[5], "%i", &pat_max);
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "mkdirrange <directory> <num_begin> <num_end> <pat_min> <pat_max>\n"
|
|
||||||
"pat_min + pat_max <= 244\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
int dirfd = open(path, O_DIRECTORY);
|
|
||||||
if (dirfd == -1) {
|
|
||||||
fprintf(stderr, "Can't open %s: %s\n", path, strerror(errno));
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
char dirname[256];
|
|
||||||
memset(dirname, 'x', 256);
|
|
||||||
|
|
||||||
for(unsigned current = begin; current < end; current++) {
|
|
||||||
int length = sprintf(dirname, "d%10.10u_", current);
|
|
||||||
dirname[length] = 'x';
|
|
||||||
length += pat_min + (current % pat_max);
|
|
||||||
dirname[length] = '\0';
|
|
||||||
if(mkdirat(dirfd, dirname, 0755)) {
|
|
||||||
fprintf(stderr, "Can't mkdir %s: %s\n", dirname, strerror(errno));
|
|
||||||
exit(1);
|
|
||||||
} else {
|
|
||||||
dirname[length] = 'x';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,65 +0,0 @@
|
|||||||
#include <stdio.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <inttypes.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#define BUF_LEN 0x10
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
uint8_t buf[BUF_LEN + 7];
|
|
||||||
int64_t len;
|
|
||||||
off_t offset;
|
|
||||||
char *path;
|
|
||||||
if (argc != 4) {
|
|
||||||
fprintf(stderr, "mkfilepattern filename offset length\n");
|
|
||||||
exit(1);
|
|
||||||
} else {
|
|
||||||
path = argv[1];
|
|
||||||
offset = strtoll(argv[2], NULL, 0);
|
|
||||||
len = strtoll(argv[3], NULL, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int fd = open(path, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
|
|
||||||
if (fd == -1) {
|
|
||||||
fprintf(stderr, "Can't open %s: %s\n", path, strerror(errno));
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
lseek(fd, offset, SEEK_SET);
|
|
||||||
for (int64_t pos = offset, count = BUF_LEN; pos < offset + len; pos += count) {
|
|
||||||
if (count > offset + len - pos) {
|
|
||||||
count = offset + len - pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
off_t off = 0;
|
|
||||||
while (off < count) {
|
|
||||||
if (pos + off < 0x100) {
|
|
||||||
*(uint8_t*)(buf + off) = (uint8_t)(pos + off);
|
|
||||||
off += 1;
|
|
||||||
} else if (pos + off < 0x10000) {
|
|
||||||
*(uint16_t*)(buf + off) = (uint16_t)(pos + off);
|
|
||||||
off += 2;
|
|
||||||
} else if (pos + off < 0x100000000l) {
|
|
||||||
*(uint32_t*)(buf + off) = (uint32_t)(pos + off);
|
|
||||||
off += 4;
|
|
||||||
} else {
|
|
||||||
*(uint64_t*)(buf + off) = (uint64_t)(pos + off);
|
|
||||||
off += 8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
write(fd, buf, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
close(fd);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,19 +0,0 @@
|
|||||||
#include "trace_lbr.h"
|
|
||||||
|
|
||||||
uint32_t coverage;
|
|
||||||
|
|
||||||
void trace_begin() {
|
|
||||||
trace_lbr_begin();
|
|
||||||
}
|
|
||||||
|
|
||||||
void trace_end() {
|
|
||||||
trace_lbr_end();
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t trace_pause(void) {
|
|
||||||
return trace_lbr_pause();
|
|
||||||
}
|
|
||||||
|
|
||||||
void trace_resume(uint32_t value) {
|
|
||||||
trace_lbr_resume(value);
|
|
||||||
}
|
|
@ -1,17 +0,0 @@
|
|||||||
#ifndef TRACE_H_INCLUDED
|
|
||||||
#define TRACE_H_INCLUDED
|
|
||||||
|
|
||||||
#include <inttypes.h>
|
|
||||||
|
|
||||||
extern uint32_t coverage;
|
|
||||||
|
|
||||||
#define COVERAGE_ON()
|
|
||||||
|
|
||||||
#define COVERAGE_OFF()
|
|
||||||
|
|
||||||
void trace_begin(void);
|
|
||||||
void trace_end(void);
|
|
||||||
uint32_t trace_pause(void);
|
|
||||||
void trace_resume(uint32_t value);
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,112 +0,0 @@
|
|||||||
#include <stdint.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include "umka.h"
|
|
||||||
|
|
||||||
#define MSR_IA32_DEBUGCTLMSR 0x1d9
|
|
||||||
#define MSR_IA32_LASTBRANCHFROMIP 0x1db
|
|
||||||
#define MSR_IA32_LASTBRANCHTOIP 0x1dc
|
|
||||||
|
|
||||||
int covfd, msrfd;
|
|
||||||
|
|
||||||
uint64_t rdmsr(uint32_t reg)
|
|
||||||
{
|
|
||||||
uint64_t data;
|
|
||||||
|
|
||||||
if (pread(msrfd, &data, sizeof data, reg) != sizeof data) {
|
|
||||||
perror("rdmsr: pread");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
void wrmsr(uint32_t reg, uint64_t data)
|
|
||||||
{
|
|
||||||
int fd;
|
|
||||||
fd = open("/dev/cpu/0/msr", O_WRONLY);
|
|
||||||
if (fd < 0) {
|
|
||||||
perror("wrmsr: open");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pwrite(fd, &data, sizeof data, reg) != sizeof data) {
|
|
||||||
perror("wrmsr: pwrite");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
close(fd);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
void handle_sigtrap() {
|
|
||||||
uint64_t from = rdmsr(MSR_IA32_LASTBRANCHFROMIP);
|
|
||||||
uint64_t to = rdmsr(MSR_IA32_LASTBRANCHTOIP);
|
|
||||||
|
|
||||||
if ((from >= (uintptr_t)coverage_begin && from < (uintptr_t)coverage_end) ||
|
|
||||||
(to >= (uintptr_t)coverage_begin && to < (uintptr_t)coverage_end)) {
|
|
||||||
write(covfd, &from, 4);
|
|
||||||
write(covfd, &to, 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
wrmsr(MSR_IA32_DEBUGCTLMSR, 3);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t set_eflags_tf(uint32_t tf) {
|
|
||||||
uint32_t prev;
|
|
||||||
__asm__ __inline__ __volatile__ (
|
|
||||||
"pushfd;"
|
|
||||||
"pop eax;"
|
|
||||||
"ror eax, 8;"
|
|
||||||
"mov edx, eax;"
|
|
||||||
"and edx, 1;"
|
|
||||||
"and eax, ~1;"
|
|
||||||
"or eax, ecx;"
|
|
||||||
"rol eax, 8;"
|
|
||||||
"push eax;"
|
|
||||||
"popfd"
|
|
||||||
: "=d"(prev)
|
|
||||||
: "c"(tf)
|
|
||||||
: "eax", "memory");
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
void trace_lbr_begin() {
|
|
||||||
struct sigaction action;
|
|
||||||
action.sa_sigaction = &handle_sigtrap;
|
|
||||||
action.sa_flags = SA_SIGINFO;
|
|
||||||
sigaction(SIGTRAP, &action, NULL);
|
|
||||||
|
|
||||||
wrmsr(MSR_IA32_DEBUGCTLMSR, 3);
|
|
||||||
msrfd = open("/dev/cpu/0/msr", O_RDONLY);
|
|
||||||
if (msrfd < 0) {
|
|
||||||
perror("rdmsr: open");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
char coverage_filename[32];
|
|
||||||
sprintf(coverage_filename, "coverage.%i", getpid());
|
|
||||||
covfd = open(coverage_filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH | S_IWOTH);
|
|
||||||
void *coverage_begin_addr = coverage_begin;
|
|
||||||
void *coverage_end_addr = coverage_end;
|
|
||||||
write(covfd, &coverage_begin_addr, 4);
|
|
||||||
write(covfd, &coverage_end_addr, 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
void trace_lbr_end() {
|
|
||||||
wrmsr(MSR_IA32_DEBUGCTLMSR, 0);
|
|
||||||
close(msrfd);
|
|
||||||
close(covfd);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t trace_lbr_pause(void) {
|
|
||||||
return set_eflags_tf(0u);
|
|
||||||
}
|
|
||||||
|
|
||||||
void trace_lbr_resume(uint32_t value) {
|
|
||||||
set_eflags_tf(value);
|
|
||||||
}
|
|
@ -1,11 +0,0 @@
|
|||||||
#ifndef TRACE_LBR_H_INCLUDED
|
|
||||||
#define TRACE_LBR_H_INCLUDED
|
|
||||||
|
|
||||||
#include <inttypes.h>
|
|
||||||
|
|
||||||
void trace_lbr_begin(void);
|
|
||||||
void trace_lbr_end(void);
|
|
||||||
uint32_t trace_lbr_pause(void);
|
|
||||||
void trace_lbr_resume(uint32_t value);
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,910 +0,0 @@
|
|||||||
; TODO: SPDX
|
|
||||||
|
|
||||||
if ~ defined win32
|
|
||||||
format ELF
|
|
||||||
else
|
|
||||||
format MS COFF
|
|
||||||
end if
|
|
||||||
|
|
||||||
macro c_public name, _alias, _argsize {
|
|
||||||
if ~ defined win32
|
|
||||||
; Use cases:
|
|
||||||
; c_public name -> 'name'
|
|
||||||
; c_public name, 'qwerty'[, nomangle] -> 'qwerty'
|
|
||||||
; c_public name, 12 -> 'name'
|
|
||||||
; c_public name, 'qwerty', 12 -> 'qwerty'
|
|
||||||
;
|
|
||||||
if ~ _argsize eq nomangle
|
|
||||||
if _alias eqtype 'string'
|
|
||||||
public name as _alias
|
|
||||||
else
|
|
||||||
public name
|
|
||||||
end if
|
|
||||||
else
|
|
||||||
public name as _alias
|
|
||||||
end if
|
|
||||||
else
|
|
||||||
; Use cases:
|
|
||||||
; c_public name -> '_name'
|
|
||||||
; c_public name, 'qwerty' -> '_qwerty'
|
|
||||||
; c_public name, 'qwerty', nomangle -> 'qwerty'
|
|
||||||
; c_public name, 12 -> '_name@12'
|
|
||||||
; c_public name, 'qwerty', 12 -> '_qwerty@12'
|
|
||||||
;
|
|
||||||
if ~ _argsize eq nomangle
|
|
||||||
if _alias eqtype 'string'
|
|
||||||
if _argsize eqtype 1
|
|
||||||
public name as '_' # _alias # '@' # `_argsize
|
|
||||||
else
|
|
||||||
public name as '_' # _alias
|
|
||||||
end if
|
|
||||||
else if _alias eqtype 1
|
|
||||||
public name as '_' # `name # '@' # `_alias
|
|
||||||
else
|
|
||||||
public name as '_' # `name
|
|
||||||
end if
|
|
||||||
else
|
|
||||||
public name as _alias
|
|
||||||
end if
|
|
||||||
end if
|
|
||||||
}
|
|
||||||
|
|
||||||
macro extrn name, _argsize {
|
|
||||||
if ~ defined win32
|
|
||||||
extrn name
|
|
||||||
else
|
|
||||||
if _argsize eqtype 1
|
|
||||||
extrn '_' # `name # '@' # `_argsize as name
|
|
||||||
else
|
|
||||||
extrn '_' # `name as name
|
|
||||||
end if
|
|
||||||
end if
|
|
||||||
}
|
|
||||||
|
|
||||||
__DEBUG__ = 1
|
|
||||||
__DEBUG_LEVEL__ = 1
|
|
||||||
|
|
||||||
UMKA_SHELL = 1
|
|
||||||
UMKA_FUSE = 2
|
|
||||||
UMKA_OS = 3
|
|
||||||
|
|
||||||
UMKA_MEMORY_BYTES = 256 SHL 20
|
|
||||||
|
|
||||||
c_public umka_sys_put_image_palette
|
|
||||||
c_public disk_add, 16
|
|
||||||
c_public disk_del, 4
|
|
||||||
c_public disk_list
|
|
||||||
c_public disk_media_changed,8
|
|
||||||
|
|
||||||
c_public xfs._.user_functions, 'xfs_user_functions'
|
|
||||||
c_public ext_user_functions
|
|
||||||
c_public fat_user_functions
|
|
||||||
c_public ntfs_user_functions
|
|
||||||
|
|
||||||
c_public i40, 'i40', nomangle
|
|
||||||
|
|
||||||
c_public coverage_begin
|
|
||||||
c_public coverage_end
|
|
||||||
|
|
||||||
c_public sha3_256_oneshot, 'hash_oneshot'
|
|
||||||
c_public kos_time_to_epoch
|
|
||||||
c_public umka_init
|
|
||||||
|
|
||||||
c_public current_process, 'kos_current_process'
|
|
||||||
c_public current_slot, 'kos_current_slot'
|
|
||||||
c_public current_slot_idx, 'kos_current_slot_idx'
|
|
||||||
|
|
||||||
c_public thread_count, 'kos_thread_count'
|
|
||||||
c_public TASK_TABLE, 'kos_task_table'
|
|
||||||
c_public TASK_BASE, 'kos_task_base'
|
|
||||||
c_public TASK_DATA, 'kos_task_data'
|
|
||||||
c_public SLOT_BASE, 'kos_slot_base'
|
|
||||||
c_public window_data, 'kos_window_data'
|
|
||||||
|
|
||||||
c_public WIN_STACK, 'kos_win_stack'
|
|
||||||
c_public WIN_POS, 'kos_win_pos'
|
|
||||||
c_public lfb_base, 'kos_lfb_base'
|
|
||||||
|
|
||||||
c_public RAMDISK, 'kos_ramdisk'
|
|
||||||
c_public ramdisk_init, 'kos_ramdisk_init'
|
|
||||||
|
|
||||||
c_public acpi_ssdt_cnt, 'kos_acpi_ssdt_cnt'
|
|
||||||
c_public acpi_ssdt_base, 'kos_acpi_ssdt_base'
|
|
||||||
c_public acpi_ssdt_size, 'kos_acpi_ssdt_size'
|
|
||||||
|
|
||||||
c_public stack_init, 'kos_stack_init'
|
|
||||||
c_public net_add_device
|
|
||||||
|
|
||||||
c_public draw_data
|
|
||||||
c_public img_background
|
|
||||||
c_public mem_BACKGROUND
|
|
||||||
c_public sys_background
|
|
||||||
c_public REDRAW_BACKGROUND, 'kos_redraw_background'
|
|
||||||
c_public new_sys_threads, 'kos_new_sys_threads', nomangle
|
|
||||||
c_public osloop, 'kos_osloop'
|
|
||||||
c_public set_mouse_data, 'kos_set_mouse_data', 20
|
|
||||||
c_public scheduler_current, 'kos_scheduler_current'
|
|
||||||
c_public eth_input, 'kos_eth_input'
|
|
||||||
c_public net_buff_alloc, 'kos_net_buff_alloc'
|
|
||||||
|
|
||||||
c_public mem_block_list
|
|
||||||
|
|
||||||
c_public acpi_dev_data, "kos_acpi_dev_data"
|
|
||||||
c_public acpi_dev_size, "kos_acpi_dev_size"
|
|
||||||
c_public kernel_alloc, "kos_kernel_alloc"
|
|
||||||
|
|
||||||
c_public window._.set_screen, 'kos_window_set_screen'
|
|
||||||
c_public _display, 'kos_display'
|
|
||||||
|
|
||||||
c_public BOOT, 'kos_boot'
|
|
||||||
|
|
||||||
macro cli {
|
|
||||||
pushfd
|
|
||||||
bts dword[esp], 21
|
|
||||||
popfd
|
|
||||||
}
|
|
||||||
|
|
||||||
macro sti {
|
|
||||||
pushfd
|
|
||||||
btr dword[esp], 21
|
|
||||||
popfd
|
|
||||||
}
|
|
||||||
|
|
||||||
iretd equ retd
|
|
||||||
|
|
||||||
lang fix en
|
|
||||||
|
|
||||||
macro int n {
|
|
||||||
if n eq 0x40
|
|
||||||
call i40
|
|
||||||
else
|
|
||||||
int n
|
|
||||||
end if
|
|
||||||
}
|
|
||||||
|
|
||||||
section '.text' executable align 64
|
|
||||||
|
|
||||||
coverage_begin:
|
|
||||||
|
|
||||||
include 'macros.inc'
|
|
||||||
|
|
||||||
macro diff16 msg,blah2,blah3 {
|
|
||||||
if msg eq "end of .data segment"
|
|
||||||
|
|
||||||
if ~ defined win32
|
|
||||||
; fasm doesn't align on 65536, but ld script does
|
|
||||||
section '.bss.aligned65k' writeable align 65536
|
|
||||||
else
|
|
||||||
section '.bss.65k' writeable align 512
|
|
||||||
end if
|
|
||||||
|
|
||||||
bss_base:
|
|
||||||
end if
|
|
||||||
}
|
|
||||||
include 'proc32.inc'
|
|
||||||
include 'struct.inc'
|
|
||||||
macro BOOT_LO a {}
|
|
||||||
macro BOOT a {}
|
|
||||||
window_data equ __pew01
|
|
||||||
TASK_TABLE equ __pew02
|
|
||||||
TASK_BASE equ __pew03
|
|
||||||
TASK_DATA equ __pew04
|
|
||||||
CDDataBuf equ __pew06
|
|
||||||
idts equ __pew07
|
|
||||||
WIN_STACK equ __pew08
|
|
||||||
WIN_POS equ __pew09
|
|
||||||
FDD_BUFF equ __pew10
|
|
||||||
WIN_TEMP_XY equ __pew11
|
|
||||||
KEY_COUNT equ __pew12
|
|
||||||
KEY_BUFF equ __pew13
|
|
||||||
BTN_COUNT equ __pew14
|
|
||||||
BTN_BUFF equ __pew15
|
|
||||||
BTN_ADDR equ __pew16
|
|
||||||
MEM_AMOUNT equ __pew17
|
|
||||||
SYS_SHUTDOWN equ __pew18
|
|
||||||
SLOT_BASE equ __pew20
|
|
||||||
sys_proc equ __pew21
|
|
||||||
VGABasePtr equ __pew22
|
|
||||||
HEAP_BASE equ __pew23
|
|
||||||
;macro OS_BASE [x] {
|
|
||||||
; OS_BASE equ os_base
|
|
||||||
;}
|
|
||||||
include 'const.inc'
|
|
||||||
restore window_data
|
|
||||||
restore TASK_TABLE
|
|
||||||
restore TASK_BASE,TASK_DATA,CDDataBuf,idts,WIN_STACK,WIN_POS
|
|
||||||
restore FDD_BUFF,WIN_TEMP_XY,KEY_COUNT,KEY_BUFF,BTN_COUNT,BTN_BUFF,BTN_ADDR
|
|
||||||
restore MEM_AMOUNT,SYS_SHUTDOWN,SLOT_BASE,sys_proc,VGABasePtr
|
|
||||||
restore HEAP_BASE
|
|
||||||
purge BOOT_LO,BOOT
|
|
||||||
|
|
||||||
LFB_BASE = lfb_base
|
|
||||||
|
|
||||||
macro save_ring3_context {
|
|
||||||
pushad
|
|
||||||
}
|
|
||||||
|
|
||||||
macro restore_ring3_context {
|
|
||||||
popad
|
|
||||||
}
|
|
||||||
|
|
||||||
macro add r, v {
|
|
||||||
if v eq TASK_TABLE - (SLOT_BASE shr 3)
|
|
||||||
push r
|
|
||||||
mov r, SLOT_BASE
|
|
||||||
shr r, 3
|
|
||||||
neg r
|
|
||||||
add r, TASK_TABLE
|
|
||||||
add esp, 4
|
|
||||||
add r, [esp-4]
|
|
||||||
else
|
|
||||||
add r, v
|
|
||||||
end if
|
|
||||||
}
|
|
||||||
|
|
||||||
macro stdcall target, [args] {
|
|
||||||
common
|
|
||||||
if target eq is_region_userspace
|
|
||||||
cmp esp, esp ; ZF
|
|
||||||
else
|
|
||||||
stdcall target, args
|
|
||||||
end if
|
|
||||||
}
|
|
||||||
|
|
||||||
include 'system.inc'
|
|
||||||
include 'fdo.inc'
|
|
||||||
|
|
||||||
include 'core/sync.inc'
|
|
||||||
;include 'core/sys32.inc'
|
|
||||||
macro call target {
|
|
||||||
if target eq do_change_task
|
|
||||||
call _do_change_task
|
|
||||||
else
|
|
||||||
call target
|
|
||||||
end if
|
|
||||||
}
|
|
||||||
;macro mov r, v {
|
|
||||||
; if r eq byte [current_slot_idx] & v eq bh
|
|
||||||
; push eax
|
|
||||||
; mov eax, ebx
|
|
||||||
; sub eax, SLOT_BASE
|
|
||||||
; shr eax, BSF sizeof.APPDATA
|
|
||||||
; mov [current_slot_idx], eax
|
|
||||||
; pop eax
|
|
||||||
; else
|
|
||||||
; mov r, v
|
|
||||||
; end if
|
|
||||||
;}
|
|
||||||
do_change_task equ hjk
|
|
||||||
irq0 equ jhg
|
|
||||||
include 'core/sched.inc'
|
|
||||||
purge call, mov
|
|
||||||
restore irq0
|
|
||||||
include 'core/syscall.inc'
|
|
||||||
;include 'core/fpu.inc'
|
|
||||||
;include 'core/memory.inc'
|
|
||||||
;include 'core/mtrr.inc'
|
|
||||||
include 'core/heap.inc'
|
|
||||||
include 'core/malloc.inc'
|
|
||||||
include 'core/taskman.inc'
|
|
||||||
include 'core/dll.inc'
|
|
||||||
;include 'core/peload.inc'
|
|
||||||
;include 'core/exports.inc'
|
|
||||||
include 'core/string.inc'
|
|
||||||
;include 'core/v86.inc'
|
|
||||||
include 'core/irq.inc'
|
|
||||||
include 'core/apic.inc'
|
|
||||||
include 'core/hpet.inc'
|
|
||||||
include 'core/timers.inc'
|
|
||||||
include 'core/clipboard.inc'
|
|
||||||
include 'core/slab.inc'
|
|
||||||
|
|
||||||
include 'posix/posix.inc'
|
|
||||||
|
|
||||||
;include 'boot/shutdown.inc'
|
|
||||||
|
|
||||||
include 'video/vesa20.inc'
|
|
||||||
include 'video/blitter.inc'
|
|
||||||
include 'video/vga.inc'
|
|
||||||
include 'video/cursors.inc'
|
|
||||||
include 'video/framebuffer.inc'
|
|
||||||
|
|
||||||
include 'gui/window.inc'
|
|
||||||
include 'gui/event.inc'
|
|
||||||
include 'gui/font.inc'
|
|
||||||
include 'gui/button.inc'
|
|
||||||
include 'gui/mouse.inc'
|
|
||||||
include 'gui/skincode.inc'
|
|
||||||
|
|
||||||
include 'hid/keyboard.inc'
|
|
||||||
include 'hid/mousedrv.inc'
|
|
||||||
;include 'hid/set_dtc.inc' ; setting date,time,clock and alarm-clock
|
|
||||||
|
|
||||||
include 'sound/playnote.inc'
|
|
||||||
|
|
||||||
;include 'bus/pci/pci32.inc'
|
|
||||||
;include 'bus/usb/init.inc'
|
|
||||||
|
|
||||||
;include 'blkdev/flp_drv.inc' ; floppy driver
|
|
||||||
;include 'blkdev/fdc.inc'
|
|
||||||
;include 'blkdev/cd_drv.inc' ; CD driver
|
|
||||||
;include 'blkdev/ide_cache.inc' ; CD cache
|
|
||||||
;include 'blkdev/hd_drv.inc' ; HDD driver
|
|
||||||
;include 'blkdev/bd_drv.inc' ; BIOS disks driver
|
|
||||||
include 'blkdev/rd.inc' ; ramdisk driver
|
|
||||||
include 'blkdev/disk.inc'
|
|
||||||
include 'blkdev/disk_cache.inc'
|
|
||||||
|
|
||||||
include 'fs/fs_lfn.inc'
|
|
||||||
|
|
||||||
include 'network/stack.inc'
|
|
||||||
|
|
||||||
include 'crc.inc'
|
|
||||||
include 'unicode.inc'
|
|
||||||
include 'acpi/acpi.inc'
|
|
||||||
|
|
||||||
include 'unpacker.inc'
|
|
||||||
|
|
||||||
LIBCRASH_CTX_LEN = 0x500 ; FIXME
|
|
||||||
include 'sha3.asm'
|
|
||||||
|
|
||||||
; TODO: stdcall attribute in umka.h
|
|
||||||
proc sha3_256_oneshot c uses ebx esi edi ebp, _ctx, _data, _len
|
|
||||||
stdcall sha3_256.oneshot, [_ctx], [_data], [_len]
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
proc kos_time_to_epoch c uses ebx esi edi ebp, _time
|
|
||||||
mov esi, [_time]
|
|
||||||
call fsCalculateTime
|
|
||||||
add eax, 978307200 ; epoch to 2001.01.01
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
proc umka._.check_alignment
|
|
||||||
mov eax, HEAP_BASE
|
|
||||||
and eax, PAGE_SIZE - 1
|
|
||||||
jz @f
|
|
||||||
mov ecx, PAGE_SIZE
|
|
||||||
sub ecx, eax
|
|
||||||
DEBUGF 4, "HEAP_BASE must be aligned on PAGE_SIZE: 0x%x", HEAP_BASE
|
|
||||||
DEBUGF 4, ", add 0x%x or sub 0x%x\n", ecx, eax
|
|
||||||
int3
|
|
||||||
@@:
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
proc umka_init c uses ebx esi edi ebp
|
|
||||||
mov [umka_initialized], 1
|
|
||||||
call umka._.check_alignment
|
|
||||||
|
|
||||||
mov edi, endofcode
|
|
||||||
mov ecx, uglobals_size
|
|
||||||
xor eax, eax
|
|
||||||
rep stosb
|
|
||||||
|
|
||||||
mov [xsave_area_size], 0x1000
|
|
||||||
|
|
||||||
mov ecx, pg_data.mutex
|
|
||||||
call mutex_init
|
|
||||||
|
|
||||||
mov ecx, disk_list_mutex
|
|
||||||
call mutex_init
|
|
||||||
|
|
||||||
mov ecx, keyboard_list_mutex
|
|
||||||
call mutex_init
|
|
||||||
|
|
||||||
mov ecx, unpack_mutex
|
|
||||||
call mutex_init
|
|
||||||
|
|
||||||
mov ecx, application_table_mutex
|
|
||||||
call mutex_init
|
|
||||||
|
|
||||||
mov ecx, ide_mutex
|
|
||||||
call mutex_init
|
|
||||||
mov ecx, ide_channel1_mutex
|
|
||||||
call mutex_init
|
|
||||||
mov ecx, ide_channel2_mutex
|
|
||||||
call mutex_init
|
|
||||||
mov ecx, ide_channel3_mutex
|
|
||||||
call mutex_init
|
|
||||||
mov ecx, ide_channel4_mutex
|
|
||||||
call mutex_init
|
|
||||||
mov ecx, ide_channel5_mutex
|
|
||||||
call mutex_init
|
|
||||||
mov ecx, ide_channel6_mutex
|
|
||||||
call mutex_init
|
|
||||||
|
|
||||||
mov [pg_data.mem_amount], UMKA_MEMORY_BYTES
|
|
||||||
mov [pg_data.pages_count], UMKA_MEMORY_BYTES / PAGE_SIZE
|
|
||||||
mov [pg_data.pages_free], UMKA_MEMORY_BYTES / PAGE_SIZE
|
|
||||||
mov eax, UMKA_MEMORY_BYTES SHR 12
|
|
||||||
mov [pg_data.kernel_pages], eax
|
|
||||||
shr eax, 10
|
|
||||||
mov [pg_data.kernel_tables], eax
|
|
||||||
call init_kernel_heap
|
|
||||||
call init_malloc
|
|
||||||
|
|
||||||
mov eax, sys_proc
|
|
||||||
list_init eax
|
|
||||||
add eax, PROC.thr_list
|
|
||||||
list_init eax
|
|
||||||
|
|
||||||
mov [BOOT.lfb], LFB_BASE
|
|
||||||
call init_video
|
|
||||||
|
|
||||||
stdcall alloc_kernel_space, 0x50000 ; FIXME check size
|
|
||||||
mov [default_io_map], eax
|
|
||||||
|
|
||||||
add eax, 0x2000
|
|
||||||
mov [ipc_tmp], eax
|
|
||||||
mov ebx, 0x1000
|
|
||||||
|
|
||||||
add eax, 0x40000
|
|
||||||
mov [proc_mem_map], eax
|
|
||||||
|
|
||||||
add eax, 0x8000
|
|
||||||
mov [proc_mem_pdir], eax
|
|
||||||
|
|
||||||
add eax, ebx
|
|
||||||
mov [proc_mem_tab], eax
|
|
||||||
|
|
||||||
add eax, ebx
|
|
||||||
mov [tmp_task_ptab], eax
|
|
||||||
|
|
||||||
add eax, ebx
|
|
||||||
mov [ipc_pdir], eax
|
|
||||||
|
|
||||||
add eax, ebx
|
|
||||||
mov [ipc_ptab], eax
|
|
||||||
|
|
||||||
stdcall kernel_alloc, (unpack.LZMA_BASE_SIZE+(unpack.LZMA_LIT_SIZE shl \
|
|
||||||
(unpack.lc+unpack.lp)))*4
|
|
||||||
mov [unpack.p], eax
|
|
||||||
|
|
||||||
call init_events
|
|
||||||
mov eax, srv.fd-SRV.fd
|
|
||||||
mov [srv.fd], eax
|
|
||||||
mov [srv.bk], eax
|
|
||||||
|
|
||||||
stdcall kernel_alloc, [_display.win_map_size]
|
|
||||||
mov [_display.win_map], eax
|
|
||||||
|
|
||||||
; set background
|
|
||||||
movi eax, 1
|
|
||||||
mov [BgrDrawMode], eax
|
|
||||||
mov [BgrDataWidth], eax
|
|
||||||
mov [BgrDataHeight], eax
|
|
||||||
mov [mem_BACKGROUND], 4
|
|
||||||
mov [img_background], static_background_data
|
|
||||||
|
|
||||||
; set clipboard
|
|
||||||
xor eax, eax
|
|
||||||
mov [clipboard_slots], eax
|
|
||||||
mov [clipboard_write_lock], eax
|
|
||||||
stdcall kernel_alloc, 4096
|
|
||||||
test eax, eax
|
|
||||||
jnz @f
|
|
||||||
|
|
||||||
dec eax
|
|
||||||
@@:
|
|
||||||
mov [clipboard_main_list], eax
|
|
||||||
|
|
||||||
mov dword[sysdir_name], 'sys'
|
|
||||||
mov dword[sysdir_path], 'RD/1'
|
|
||||||
mov word[sysdir_path+4], 0
|
|
||||||
|
|
||||||
;call ramdisk_init
|
|
||||||
|
|
||||||
mov [X_UNDER], 500
|
|
||||||
mov [Y_UNDER], 500
|
|
||||||
mov word[MOUSE_X], 40
|
|
||||||
mov word[MOUSE_Y], 30
|
|
||||||
|
|
||||||
mov eax, -1
|
|
||||||
mov edi, thr_slot_map+4
|
|
||||||
mov [edi-4], dword 0xFFFFFFF8
|
|
||||||
stosd
|
|
||||||
stosd
|
|
||||||
stosd
|
|
||||||
stosd
|
|
||||||
stosd
|
|
||||||
stosd
|
|
||||||
stosd
|
|
||||||
|
|
||||||
mov [current_process], sys_proc
|
|
||||||
|
|
||||||
mov [current_slot_idx], 0
|
|
||||||
mov [thread_count], 0
|
|
||||||
|
|
||||||
mov eax, [xsave_area_size]
|
|
||||||
add eax, RING0_STACK_SIZE
|
|
||||||
stdcall kernel_alloc, eax
|
|
||||||
mov ebx, eax
|
|
||||||
mov edx, SLOT_BASE+256*1
|
|
||||||
call setup_os_slot
|
|
||||||
mov dword[edx], 'IDLE'
|
|
||||||
sub [edx+APPDATA.saved_esp], 4
|
|
||||||
mov eax, [edx+APPDATA.saved_esp]
|
|
||||||
mov dword[eax], idle
|
|
||||||
mov ecx, IDLE_PRIORITY
|
|
||||||
call scheduler_add_thread
|
|
||||||
|
|
||||||
mov eax, [xsave_area_size]
|
|
||||||
add eax, RING0_STACK_SIZE
|
|
||||||
stdcall kernel_alloc, eax
|
|
||||||
mov ebx, eax
|
|
||||||
mov edx, SLOT_BASE+256*2
|
|
||||||
call setup_os_slot
|
|
||||||
mov dword[edx], 'OS'
|
|
||||||
sub [edx+APPDATA.saved_esp], 4
|
|
||||||
mov eax, [edx+APPDATA.saved_esp]
|
|
||||||
mov dword[eax], 0
|
|
||||||
xor ecx, ecx
|
|
||||||
call scheduler_add_thread
|
|
||||||
|
|
||||||
mov [current_slot_idx], 2
|
|
||||||
mov [thread_count], 2
|
|
||||||
mov dword[TASK_BASE], TASK_TABLE + 2*sizeof.TASKDATA
|
|
||||||
mov [current_slot], SLOT_BASE+2*sizeof.APPDATA
|
|
||||||
mov [TASK_TABLE + 2*sizeof.TASKDATA + TASKDATA.pid], 2
|
|
||||||
|
|
||||||
call set_window_defaults
|
|
||||||
call init_background
|
|
||||||
call calculatebackground
|
|
||||||
call init_display
|
|
||||||
mov eax, [def_cursor]
|
|
||||||
mov [SLOT_BASE+APPDATA.cursor+sizeof.APPDATA], eax
|
|
||||||
mov [SLOT_BASE+APPDATA.cursor+sizeof.APPDATA*2], eax
|
|
||||||
|
|
||||||
; from set_variables
|
|
||||||
xor eax, eax
|
|
||||||
mov [BTN_ADDR], dword BUTTON_INFO ; address of button list
|
|
||||||
mov byte [KEY_COUNT], al ; keyboard buffer
|
|
||||||
mov byte [BTN_COUNT], al ; button buffer
|
|
||||||
|
|
||||||
mov ebx, SLOT_BASE + 2*sizeof.APPDATA
|
|
||||||
mov word[cur_dir.path], '/'
|
|
||||||
mov [ebx+APPDATA.cur_dir], cur_dir
|
|
||||||
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
c_public skin_udata
|
|
||||||
proc idle uses ebx esi edi
|
|
||||||
.loop:
|
|
||||||
mov ecx, 10000000
|
|
||||||
@@:
|
|
||||||
loop @b
|
|
||||||
; DEBUGF 1, "1 idle\n"
|
|
||||||
jmp .loop
|
|
||||||
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
extrn pci_read, 20
|
|
||||||
proc pci_read_reg uses ebx esi edi
|
|
||||||
mov ecx, eax
|
|
||||||
and ecx, 3
|
|
||||||
movi edx, 1
|
|
||||||
shl edx, cl
|
|
||||||
push edx ; len
|
|
||||||
movzx edx, bl
|
|
||||||
push edx ; offset
|
|
||||||
movzx edx, bh
|
|
||||||
and edx, 7
|
|
||||||
push edx ; fun
|
|
||||||
movzx edx, bh
|
|
||||||
shr edx, 3
|
|
||||||
push edx ; dev
|
|
||||||
movzx edx, ah
|
|
||||||
push edx ; bus
|
|
||||||
call pci_read
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
proc sys_msg_board
|
|
||||||
cmp cl, 0x0d
|
|
||||||
jz @f
|
|
||||||
if ~ defined win32
|
|
||||||
pushad
|
|
||||||
mov eax, SYS_WRITE
|
|
||||||
mov ebx, STDOUT
|
|
||||||
push ecx
|
|
||||||
mov ecx, esp
|
|
||||||
mov edx, 1
|
|
||||||
int 0x80
|
|
||||||
pop ecx
|
|
||||||
popad
|
|
||||||
else
|
|
||||||
extrn putchar
|
|
||||||
|
|
||||||
pushad
|
|
||||||
push ecx
|
|
||||||
call putchar
|
|
||||||
add esp, 4
|
|
||||||
popad
|
|
||||||
end if
|
|
||||||
@@:
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
proc delay_ms
|
|
||||||
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
c_public umka_cli
|
|
||||||
proc umka_cli
|
|
||||||
cli ; macro
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
c_public umka_sti
|
|
||||||
proc umka_sti
|
|
||||||
sti ; macro
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
proc umka_sys_put_image_palette c, image, xsize, ysize, x, y, bpp, palette, row_offset
|
|
||||||
pushad
|
|
||||||
push ebp
|
|
||||||
mov eax, 65
|
|
||||||
mov ebx, [image]
|
|
||||||
mov ecx, [xsize]
|
|
||||||
shl ecx, 16
|
|
||||||
or ecx, [ysize]
|
|
||||||
mov edx, [x]
|
|
||||||
shl edx, 16
|
|
||||||
or edx, [y]
|
|
||||||
mov esi, [bpp]
|
|
||||||
mov edi, [palette]
|
|
||||||
mov ebp, [row_offset]
|
|
||||||
call i40
|
|
||||||
pop ebp
|
|
||||||
popad
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
extrn reset_procmask
|
|
||||||
extrn get_fake_if
|
|
||||||
c_public irq0
|
|
||||||
proc irq0 c, _signo, _info, _context
|
|
||||||
DEBUGF 2, "### irq0\n"
|
|
||||||
pushfd
|
|
||||||
cli
|
|
||||||
pushad
|
|
||||||
|
|
||||||
inc [timer_ticks]
|
|
||||||
call updatecputimes
|
|
||||||
ccall reset_procmask
|
|
||||||
ccall get_fake_if, [_context]
|
|
||||||
test eax, eax
|
|
||||||
jnz @f
|
|
||||||
DEBUGF 2, "### cli\n"
|
|
||||||
jmp .done
|
|
||||||
@@:
|
|
||||||
|
|
||||||
mov bl, SCHEDULE_ANY_PRIORITY
|
|
||||||
call find_next_task
|
|
||||||
jz .done ; if there is only one running process
|
|
||||||
call _do_change_task
|
|
||||||
.done:
|
|
||||||
popad
|
|
||||||
popfd
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
proc _do_change_task
|
|
||||||
mov eax, [current_slot]
|
|
||||||
sub eax, SLOT_BASE
|
|
||||||
shr eax, 8
|
|
||||||
mov ecx, ebx
|
|
||||||
sub ecx, SLOT_BASE
|
|
||||||
shr ecx, 8
|
|
||||||
DEBUGF 2, "### switching task from %d to %d\n",eax,ecx
|
|
||||||
|
|
||||||
mov esi, ebx
|
|
||||||
xchg esi, [current_slot]
|
|
||||||
; set new stack after saving old
|
|
||||||
mov [esi+APPDATA.saved_esp], esp
|
|
||||||
mov esp, [ebx+APPDATA.saved_esp]
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
proc map_io_mem _base, _size, _flags
|
|
||||||
mov eax, [_base]
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
sysfn_saveramdisk:
|
|
||||||
sysfn_meminfo:
|
|
||||||
check_fdd_motor_status:
|
|
||||||
check_ATAPI_device_event:
|
|
||||||
check_fdd_motor_status_has_work?:
|
|
||||||
check_ATAPI_device_event_has_work?:
|
|
||||||
request_terminate:
|
|
||||||
system_shutdown:
|
|
||||||
terminate:
|
|
||||||
LoadMedium:
|
|
||||||
clear_CD_cache:
|
|
||||||
allow_medium_removal:
|
|
||||||
EjectMedium:
|
|
||||||
save_image:
|
|
||||||
init_sys_v86:
|
|
||||||
pci_enum:
|
|
||||||
load_pe_driver:
|
|
||||||
usb_init:
|
|
||||||
fdc_init:
|
|
||||||
mtrr_validate:
|
|
||||||
protect_from_terminate:
|
|
||||||
unprotect_from_terminate:
|
|
||||||
ReadCDWRetr:
|
|
||||||
WaitUnitReady:
|
|
||||||
prevent_medium_removal:
|
|
||||||
Read_TOC:
|
|
||||||
commit_pages:
|
|
||||||
release_pages:
|
|
||||||
lock_application_table:
|
|
||||||
unlock_application_table:
|
|
||||||
get_pg_addr:
|
|
||||||
free_page:
|
|
||||||
build_interrupt_table:
|
|
||||||
init_fpu:
|
|
||||||
init_mtrr:
|
|
||||||
create_trampoline_pgmap:
|
|
||||||
alloc_page:
|
|
||||||
pci_write_reg:
|
|
||||||
|
|
||||||
sys_settime:
|
|
||||||
sys_pcibios:
|
|
||||||
sys_IPC:
|
|
||||||
pci_api:
|
|
||||||
sys_resize_app_memory:
|
|
||||||
f68:
|
|
||||||
v86_irq:
|
|
||||||
test_cpu:
|
|
||||||
acpi_locate:
|
|
||||||
init_BIOS32:
|
|
||||||
mem_test:
|
|
||||||
init_mem:
|
|
||||||
init_page_map:
|
|
||||||
ahci_init:
|
|
||||||
ret
|
|
||||||
|
|
||||||
alloc_pages:
|
|
||||||
ret 4
|
|
||||||
create_ring_buffer:
|
|
||||||
ret 8
|
|
||||||
map_page:
|
|
||||||
ret 12
|
|
||||||
map_memEx:
|
|
||||||
ret 20
|
|
||||||
|
|
||||||
sys_msg_board equ __pex0
|
|
||||||
delay_ms equ __pex1
|
|
||||||
|
|
||||||
include fix pew
|
|
||||||
macro pew x {}
|
|
||||||
macro pew x {inclu#de `x}
|
|
||||||
macro org x {}
|
|
||||||
macro format [x] {}
|
|
||||||
|
|
||||||
macro lea r, v {
|
|
||||||
if v eq [(ecx-(TASK_TABLE and 1FFFFFFFh)-TASKDATA.state)*8+SLOT_BASE]
|
|
||||||
int3
|
|
||||||
else if v eq [(edx-(TASK_TABLE and 1FFFFFFFh))*8+SLOT_BASE]
|
|
||||||
int3
|
|
||||||
else
|
|
||||||
lea r, v
|
|
||||||
end if
|
|
||||||
}
|
|
||||||
|
|
||||||
include 'kernel.asm'
|
|
||||||
|
|
||||||
purge lea,add,org,mov
|
|
||||||
restore lea,add,org,mov
|
|
||||||
purge sys_msg_board,delay_ms
|
|
||||||
restore sys_msg_board,delay_ms
|
|
||||||
|
|
||||||
coverage_end:
|
|
||||||
|
|
||||||
if ~ defined win32
|
|
||||||
; fasm doesn't align on 65536, but ld script does
|
|
||||||
section '.data.aligned65k' writeable align 65536
|
|
||||||
else
|
|
||||||
section '.data' readable writeable align 512
|
|
||||||
end if
|
|
||||||
|
|
||||||
c_public umka_tool
|
|
||||||
umka_tool dd ?
|
|
||||||
c_public umka_initialized
|
|
||||||
umka_initialized dd 0
|
|
||||||
fpu_owner dd ?
|
|
||||||
|
|
||||||
BOOT boot_data
|
|
||||||
virtual at BOOT
|
|
||||||
BOOT_LO boot_data
|
|
||||||
end virtual
|
|
||||||
|
|
||||||
uglobal
|
|
||||||
align 64
|
|
||||||
os_base: rb PAGE_SIZE
|
|
||||||
window_data: rb sizeof.WDATA * 256
|
|
||||||
TASK_TABLE: rb 16
|
|
||||||
TASK_BASE: rd 4
|
|
||||||
TASK_DATA: rd sizeof.TASKDATA * 255 / 4
|
|
||||||
CDDataBuf: rb 0x1000
|
|
||||||
idts rb IRQ_RESERVED * 8 ; IDT descriptor is 8 bytes long
|
|
||||||
WIN_STACK rw 0x200 ; why not 0x100?
|
|
||||||
WIN_POS rw 0x200
|
|
||||||
FDD_BUFF: rb 0x400
|
|
||||||
WIN_TEMP_XY rb 0x100
|
|
||||||
KEY_COUNT db ?
|
|
||||||
KEY_BUFF rb 255 ; 120*2 + 2*2 = 244 bytes, actually 255 bytes
|
|
||||||
BTN_COUNT db ?
|
|
||||||
BTN_BUFF rd 0x261
|
|
||||||
BTN_ADDR dd ?
|
|
||||||
MEM_AMOUNT rd 0x1d
|
|
||||||
SYS_SHUTDOWN db ?
|
|
||||||
sys_proc: rb sizeof.PROC * 256
|
|
||||||
rb 0x10000 - (($-bss_base) AND (0x10000-1)) ; align on 0x10000
|
|
||||||
SLOT_BASE: rb sizeof.APPDATA * 256
|
|
||||||
VGABasePtr rb 640*480
|
|
||||||
rb PAGE_SIZE - (($-bss_base) AND (PAGE_SIZE-1)) ; align on page
|
|
||||||
HEAP_BASE rb UMKA_MEMORY_BYTES - (HEAP_BASE - os_base + \
|
|
||||||
PAGE_SIZE * sizeof.MEM_BLOCK)
|
|
||||||
endg
|
|
||||||
|
|
||||||
uglobal
|
|
||||||
v86_irqhooks rd IRQ_RESERVED*2
|
|
||||||
cache_ide0 IDE_CACHE
|
|
||||||
cache_ide1 IDE_CACHE
|
|
||||||
DiskNumber db ?
|
|
||||||
ChannelNumber db ?
|
|
||||||
DevErrorCode dd ?
|
|
||||||
CDSectorAddress dd ?
|
|
||||||
CDDataBuf_pointer dd ?
|
|
||||||
allow_dma_access db ?
|
|
||||||
ide_mutex MUTEX
|
|
||||||
ide_channel1_mutex MUTEX
|
|
||||||
ide_channel2_mutex MUTEX
|
|
||||||
ide_channel3_mutex MUTEX
|
|
||||||
ide_channel4_mutex MUTEX
|
|
||||||
ide_channel5_mutex MUTEX
|
|
||||||
ide_channel6_mutex MUTEX
|
|
||||||
ide_channel7_mutex MUTEX
|
|
||||||
ide_channel8_mutex MUTEX
|
|
||||||
|
|
||||||
lfb_base rd MAX_SCREEN_WIDTH*MAX_SCREEN_HEIGHT
|
|
||||||
|
|
||||||
align 4096
|
|
||||||
cur_dir:
|
|
||||||
.encoding rb 1
|
|
||||||
.path rb maxPathLength
|
|
||||||
|
|
||||||
BgrAuxTable rb 32768
|
|
||||||
BgrAuxTable equ
|
|
||||||
SB16Buffer rb 65536
|
|
||||||
SB16Buffer equ
|
|
||||||
BUTTON_INFO rb 64*1024
|
|
||||||
BUTTON_INFO equ
|
|
||||||
endg
|
|
||||||
|
|
||||||
macro org x {
|
|
||||||
if x eq (OS_BASE+0x0100000)
|
|
||||||
else
|
|
||||||
org x
|
|
||||||
end if
|
|
||||||
}
|
|
||||||
|
|
||||||
macro align x {
|
|
||||||
if x eq 65536
|
|
||||||
else if x eq 4096
|
|
||||||
else
|
|
||||||
align x
|
|
||||||
end if
|
|
||||||
}
|
|
||||||
|
|
||||||
macro assert [x] {}
|
|
||||||
include 'data32.inc'
|
|
File diff suppressed because it is too large
Load Diff
@ -1,20 +0,0 @@
|
|||||||
SECTIONS
|
|
||||||
{
|
|
||||||
. = ALIGN(65536);
|
|
||||||
.data.aligned :
|
|
||||||
{
|
|
||||||
*(SORT_BY_NAME(.data.align*))
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
INSERT AFTER .data;
|
|
||||||
|
|
||||||
SECTIONS
|
|
||||||
{
|
|
||||||
. = ALIGN(65536);
|
|
||||||
.bss.aligned :
|
|
||||||
{
|
|
||||||
*(SORT_BY_NAME(.bss.align*))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
INSERT AFTER .bss;
|
|
@ -1,168 +0,0 @@
|
|||||||
/*
|
|
||||||
UMKa - User-Mode KolibriOS developer tools
|
|
||||||
umka_fuse - FUSE <-> KolibriOS FS calls converter
|
|
||||||
Copyright (C) 2018--2020 Ivan Baravy <dunkaist@gmail.com>
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define FUSE_USE_VERSION 31
|
|
||||||
|
|
||||||
#include <fuse.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include "vdisk.h"
|
|
||||||
#include "umka.h"
|
|
||||||
|
|
||||||
#define UMKA_DEFAULT_DISPLAY_WIDTH 400
|
|
||||||
#define UMKA_DEFAULT_DISPLAY_HEIGHT 300
|
|
||||||
|
|
||||||
#define DIRENTS_TO_READ 100
|
|
||||||
|
|
||||||
static void
|
|
||||||
bdfe_to_stat(bdfe_t *kf, struct stat *st) {
|
|
||||||
// if (kf->attr & KF_FOLDER) {
|
|
||||||
if (st) {
|
|
||||||
st->st_mode = S_IFDIR | 0755;
|
|
||||||
st->st_nlink = 2;
|
|
||||||
} else {
|
|
||||||
st->st_mode = S_IFREG | 0644;
|
|
||||||
st->st_nlink = 1;
|
|
||||||
st->st_size = kf->size;
|
|
||||||
}
|
|
||||||
st->st_atime = kos_time_to_epoch(&(kf->atime));
|
|
||||||
st->st_mtime = kos_time_to_epoch(&(kf->mtime));
|
|
||||||
st->st_ctime = kos_time_to_epoch(&(kf->ctime));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void *
|
|
||||||
umka_fuse_init(struct fuse_conn_info *conn, struct fuse_config *cfg) {
|
|
||||||
(void) conn;
|
|
||||||
cfg->kernel_cache = 1;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
umka_getattr(const char *path, struct stat *stbuf, struct fuse_file_info *fi) {
|
|
||||||
(void) fi;
|
|
||||||
int res = 0;
|
|
||||||
|
|
||||||
bdfe_t file;
|
|
||||||
f7080s5arg_t fX0 = {.sf = 5,
|
|
||||||
.flags = 0,
|
|
||||||
.buf = &file,
|
|
||||||
.u = {.f80 = {.path_encoding = UTF8,
|
|
||||||
.path = path
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
f7080ret_t r;
|
|
||||||
umka_sys_lfn(&fX0, &r, F80);
|
|
||||||
|
|
||||||
bdfe_to_stat(&file, stbuf);
|
|
||||||
// res = -ENOENT;
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
umka_readdir(const char *path, void *buf, fuse_fill_dir_t filler, off_t offset,
|
|
||||||
struct fuse_file_info *fi, enum fuse_readdir_flags flags) {
|
|
||||||
(void) offset; // TODO
|
|
||||||
(void) fi;
|
|
||||||
(void) flags;
|
|
||||||
|
|
||||||
f7080s1info_t *dir = (f7080s1info_t*)malloc(sizeof(f7080s1info_t) +
|
|
||||||
BDFE_LEN_UNICODE * DIRENTS_TO_READ);
|
|
||||||
f7080s1arg_t fX0 = {.sf = 1,
|
|
||||||
.offset = 0,
|
|
||||||
.encoding = UTF8,
|
|
||||||
.size = DIRENTS_TO_READ,
|
|
||||||
.buf = dir,
|
|
||||||
.u = {.f80 = {.path_encoding = UTF8,
|
|
||||||
.path = path
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
f7080ret_t r;
|
|
||||||
umka_sys_lfn(&fX0, &r, F80);
|
|
||||||
bdfe_t *bdfe = dir->bdfes;
|
|
||||||
for (size_t i = 0; i < dir->cnt; i++) {
|
|
||||||
filler(buf, bdfe->name, NULL, 0, 0);
|
|
||||||
bdfe = (bdfe_t*)((uintptr_t)bdfe + BDFE_LEN_UNICODE);
|
|
||||||
}
|
|
||||||
free(dir);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
umka_open(const char *path, struct fuse_file_info *fi) {
|
|
||||||
// if (strcmp(path+1, "blah") != 0)
|
|
||||||
// return -ENOENT;
|
|
||||||
(void) path;
|
|
||||||
|
|
||||||
if ((fi->flags & O_ACCMODE) != O_RDONLY)
|
|
||||||
return -EACCES;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
umka_read(const char *path, char *buf, size_t size, off_t offset,
|
|
||||||
struct fuse_file_info *fi) {
|
|
||||||
(void) fi;
|
|
||||||
|
|
||||||
f7080s0arg_t fX0 = {.sf = 0, .offset = offset, .count = size, .buf = buf,
|
|
||||||
.u = {.f80 = {.path_encoding = UTF8, .path = path}}};
|
|
||||||
f7080ret_t r;
|
|
||||||
umka_sys_lfn(&fX0, &r, F80);
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct fuse_operations umka_oper = {
|
|
||||||
.init = umka_fuse_init,
|
|
||||||
.getattr = umka_getattr,
|
|
||||||
.readdir = umka_readdir,
|
|
||||||
.open = umka_open,
|
|
||||||
.read = umka_read,
|
|
||||||
};
|
|
||||||
|
|
||||||
int
|
|
||||||
main(int argc, char *argv[]) {
|
|
||||||
umka_tool = UMKA_FUSE;
|
|
||||||
if (argc != 3) {
|
|
||||||
printf("usage: umka_fuse dir img\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
kos_boot.bpp = 32;
|
|
||||||
kos_boot.x_res = UMKA_DEFAULT_DISPLAY_WIDTH;
|
|
||||||
kos_boot.y_res = UMKA_DEFAULT_DISPLAY_HEIGHT;
|
|
||||||
kos_boot.pitch = UMKA_DEFAULT_DISPLAY_WIDTH*4; // 32bpp
|
|
||||||
|
|
||||||
umka_init();
|
|
||||||
void *userdata = vdisk_init(argv[2], 1, 0u);
|
|
||||||
void *vdisk = disk_add(&vdisk_functions, "hd0", userdata, 0);
|
|
||||||
disk_media_changed(vdisk, 1);
|
|
||||||
return fuse_main(argc-1, argv, &umka_oper, NULL);
|
|
||||||
}
|
|
@ -1,149 +0,0 @@
|
|||||||
/*
|
|
||||||
UMKa - User-Mode KolibriOS developer tools
|
|
||||||
umka_os - kind of KolibriOS rump kernel
|
|
||||||
Copyright (C) 2018--2021 Ivan Baravy <dunkaist@gmail.com>
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/mman.h>
|
|
||||||
#include <sys/select.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include "umka.h"
|
|
||||||
#include "shell.h"
|
|
||||||
#include "trace.h"
|
|
||||||
|
|
||||||
#define UMKA_DEFAULT_DISPLAY_WIDTH 400
|
|
||||||
#define UMKA_DEFAULT_DISPLAY_HEIGHT 300
|
|
||||||
|
|
||||||
#define THREAD_STACK_SIZE 0x100000
|
|
||||||
|
|
||||||
static void
|
|
||||||
monitor(void) {
|
|
||||||
umka_sti();
|
|
||||||
fprintf(stderr, "Start monitor thread\n");
|
|
||||||
FILE *fin = fopen("/tmp/umka.fifo.2u", "r");
|
|
||||||
FILE *fout = fopen("/tmp/umka.fifo.4u", "w");
|
|
||||||
if (!fin || !fout) {
|
|
||||||
fprintf(stderr, "Can't open monitor files!\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
run_test(fin, fout, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void umka_thread_ping(void);
|
|
||||||
void umka_thread_net_drv(void);
|
|
||||||
|
|
||||||
struct itimerval timeout = {.it_value = {.tv_sec = 0, .tv_usec = 10000},
|
|
||||||
.it_interval = {.tv_sec = 0, .tv_usec = 10000}};
|
|
||||||
|
|
||||||
static void
|
|
||||||
thread_start(int is_kernel, void (*entry)(void), size_t stack_size) {
|
|
||||||
uint8_t *stack = malloc(stack_size);
|
|
||||||
umka_new_sys_threads(is_kernel, entry, stack + stack_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
can't get pty working
|
|
||||||
may be because of my custom threads and blocking, don't know
|
|
||||||
void new_monitor(void) {
|
|
||||||
umka_sti();
|
|
||||||
fprintf(stderr, "Start monitor thread\n");
|
|
||||||
|
|
||||||
int mpty = posix_openpt(O_RDWR | O_NOCTTY);
|
|
||||||
if (mpty == -1) {
|
|
||||||
perror("open master pty");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (grantpt(mpty) == -1) {
|
|
||||||
perror("grantpt");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (unlockpt(mpty) == -1) {
|
|
||||||
perror("unlockpt");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
char *spty_name = ptsname(mpty);
|
|
||||||
if (spty_name == NULL) {
|
|
||||||
perror("open slave pty");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
fprintf(stderr, "[os] pty=%s\n", spty_name);
|
|
||||||
FILE *fmpty = fdopen(mpty, "r+");
|
|
||||||
if (fmpty == NULL) {
|
|
||||||
perror("fdopen mpty");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
run_test(fmpty, fmpty, 0);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
int
|
|
||||||
main() {
|
|
||||||
if (coverage)
|
|
||||||
trace_begin();
|
|
||||||
|
|
||||||
umka_tool = UMKA_OS;
|
|
||||||
umka_sti();
|
|
||||||
|
|
||||||
struct sigaction sa;
|
|
||||||
sa.sa_sigaction = irq0;
|
|
||||||
sigemptyset(&sa.sa_mask);
|
|
||||||
sa.sa_flags = SA_SIGINFO;
|
|
||||||
|
|
||||||
if (sigaction(SIGPROF, &sa, NULL) == -1) {
|
|
||||||
printf("Can't install signal handler!\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
void *app_base = mmap((void*)0x000000, 16*0x100000, PROT_READ | PROT_WRITE |
|
|
||||||
PROT_EXEC, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS,
|
|
||||||
-1, 0);
|
|
||||||
if (app_base == MAP_FAILED) {
|
|
||||||
perror("mmap failed");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
printf("pid=%d, kos_lfb_base=%p\n", getpid(), (void*)kos_lfb_base);
|
|
||||||
|
|
||||||
kos_boot.bpp = 32;
|
|
||||||
kos_boot.x_res = UMKA_DEFAULT_DISPLAY_WIDTH;
|
|
||||||
kos_boot.y_res = UMKA_DEFAULT_DISPLAY_HEIGHT;
|
|
||||||
kos_boot.pitch = UMKA_DEFAULT_DISPLAY_WIDTH*4; // 32bpp
|
|
||||||
|
|
||||||
umka_init();
|
|
||||||
umka_stack_init();
|
|
||||||
|
|
||||||
thread_start(0, monitor, THREAD_STACK_SIZE);
|
|
||||||
thread_start(0, umka_thread_net_drv, THREAD_STACK_SIZE);
|
|
||||||
// thread_start(0, umka_thread_ping, THREAD_STACK_SIZE);
|
|
||||||
|
|
||||||
setitimer(ITIMER_PROF, &timeout, NULL);
|
|
||||||
|
|
||||||
kos_osloop(); // doesn't return
|
|
||||||
|
|
||||||
if (coverage)
|
|
||||||
trace_end();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,192 +0,0 @@
|
|||||||
/*
|
|
||||||
umka_shell: User-Mode KolibriOS developer tools, the ping
|
|
||||||
Copyright (C) 2020 Ivan Baravy <dunkaist@gmail.com>
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <inttypes.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <linux/if_tun.h>
|
|
||||||
#include <net/if.h>
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/ioctl.h>
|
|
||||||
#include <sys/select.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include "shell.h"
|
|
||||||
#include "umka.h"
|
|
||||||
#include "vnet.h"
|
|
||||||
|
|
||||||
uint8_t packet[4096] = {0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 'a','b',
|
|
||||||
'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
|
|
||||||
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
|
|
||||||
'y', 'z', '0', '1', '2', '3', '4', '5'};
|
|
||||||
|
|
||||||
static int
|
|
||||||
tap_alloc(char *dev) {
|
|
||||||
int flags = IFF_TAP | IFF_NO_PI;
|
|
||||||
struct ifreq ifr;
|
|
||||||
int fd, err;
|
|
||||||
char *clonedev = "/dev/net/tun";
|
|
||||||
|
|
||||||
if( (fd = open(clonedev , O_RDWR | O_NONBLOCK)) < 0 )
|
|
||||||
{
|
|
||||||
perror("Opening /dev/net/tun");
|
|
||||||
return fd;
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(&ifr, 0, sizeof(ifr));
|
|
||||||
|
|
||||||
ifr.ifr_flags = flags;
|
|
||||||
|
|
||||||
if(*dev)
|
|
||||||
{
|
|
||||||
strncpy(ifr.ifr_name, dev, IFNAMSIZ);
|
|
||||||
}
|
|
||||||
|
|
||||||
if( (err = ioctl(fd, TUNSETIFF, (void *)&ifr)) < 0 )
|
|
||||||
{
|
|
||||||
perror("ioctl(TUNSETIFF)");
|
|
||||||
close(fd);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
strcpy(dev, ifr.ifr_name);
|
|
||||||
|
|
||||||
return fd;
|
|
||||||
}
|
|
||||||
|
|
||||||
int go_ping = 0;
|
|
||||||
|
|
||||||
void
|
|
||||||
umka_thread_ping(void) {
|
|
||||||
umka_sti();
|
|
||||||
while (!go_ping) { /* wait until initialized */ }
|
|
||||||
|
|
||||||
f75ret_t r75;
|
|
||||||
r75 = umka_sys_net_open_socket(AF_INET4, SOCK_STREAM, IPPROTO_TCP);
|
|
||||||
if (r75.value == (uint32_t)-1) {
|
|
||||||
fprintf(stderr, "[ping] open error %u\n", r75.errorcode);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
uint32_t sockfd = r75.value;
|
|
||||||
|
|
||||||
// uint32_t addr = inet_addr("127.0.0.1");
|
|
||||||
// uint32_t addr = inet_addr("192.243.108.5");
|
|
||||||
uint32_t addr = inet_addr("10.50.0.1");
|
|
||||||
// uint32_t addr = inet_addr("192.168.1.30");
|
|
||||||
uint16_t port = 5000;
|
|
||||||
|
|
||||||
struct sockaddr_in sa;
|
|
||||||
memset(&sa, 0, sizeof(sa));
|
|
||||||
sa.sin_family = AF_INET4;
|
|
||||||
sa.sin_port = htons(port);
|
|
||||||
sa.sin_addr.s_addr = addr;
|
|
||||||
|
|
||||||
r75 = umka_sys_net_connect(sockfd, &sa, sizeof(struct sockaddr_in));
|
|
||||||
if (r75.value == (uint32_t)-1) {
|
|
||||||
fprintf(stderr, "[ping] connect error %u\n", r75.errorcode);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
r75 = umka_sys_net_send(sockfd, packet, 128, 0);
|
|
||||||
if (r75.value == (uint32_t)-1) {
|
|
||||||
fprintf(stderr, "[ping] send error %u\n", r75.errorcode);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (true) {}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
umka_thread_net_drv(void) {
|
|
||||||
umka_sti();
|
|
||||||
fprintf(stderr, "[net_drv] starting\n");
|
|
||||||
int tapfd;
|
|
||||||
uint8_t buffer[2048];
|
|
||||||
int plen = 0;
|
|
||||||
char tapdev[IFNAMSIZ] = "tap0";
|
|
||||||
tapfd = tap_alloc(tapdev);
|
|
||||||
net_device_t *vnet = vnet_init(tapfd);
|
|
||||||
kos_net_add_device(vnet);
|
|
||||||
|
|
||||||
char devname[64];
|
|
||||||
for (size_t i = 0; i < umka_sys_net_get_dev_count(); i++) {
|
|
||||||
umka_sys_net_dev_reset(i);
|
|
||||||
umka_sys_net_get_dev_name(i, devname);
|
|
||||||
uint32_t devtype = umka_sys_net_get_dev_type(i);
|
|
||||||
fprintf(stderr, "[net_drv] device %i: %s %u\n", i, devname, devtype);
|
|
||||||
}
|
|
||||||
|
|
||||||
f76ret_t r76;
|
|
||||||
r76 = umka_sys_net_ipv4_set_subnet(1, inet_addr("255.255.255.0"));
|
|
||||||
if (r76.eax == (uint32_t)-1) {
|
|
||||||
fprintf(stderr, "[net_drv] set subnet error\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// r76 = umka_sys_net_ipv4_set_gw(1, inet_addr("192.168.1.1"));
|
|
||||||
r76 = umka_sys_net_ipv4_set_gw(1, inet_addr("10.50.0.1"));
|
|
||||||
if (r76.eax == (uint32_t)-1) {
|
|
||||||
fprintf(stderr, "set gw error\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
r76 = umka_sys_net_ipv4_set_dns(1, inet_addr("217.10.36.5"));
|
|
||||||
if (r76.eax == (uint32_t)-1) {
|
|
||||||
fprintf(stderr, "[net_drv] set dns error\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
r76 = umka_sys_net_ipv4_set_addr(1, inet_addr("10.50.0.2"));
|
|
||||||
if (r76.eax == (uint32_t)-1) {
|
|
||||||
fprintf(stderr, "[net_drv] set ip addr error\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
go_ping = 1;
|
|
||||||
|
|
||||||
while(true)
|
|
||||||
{
|
|
||||||
plen = read(tapfd, buffer, 2*1024);
|
|
||||||
if (plen > 0) {
|
|
||||||
fprintf(stderr, "[net_drv] read %i bytes\n", plen);
|
|
||||||
for (int i = 0; i < plen; i++) {
|
|
||||||
fprintf(stderr, " %2.2x", buffer[i]);
|
|
||||||
}
|
|
||||||
fprintf(stderr, "\n");
|
|
||||||
vnet_receive_frame(vnet, buffer, plen);
|
|
||||||
} else if(plen == -1 && (errno == EAGAIN || errno == EINTR)) {
|
|
||||||
continue;
|
|
||||||
} else {
|
|
||||||
perror("[net_drv] reading data");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,87 +0,0 @@
|
|||||||
/*
|
|
||||||
umka_shell: User-Mode KolibriOS developer tools, the shell
|
|
||||||
Copyright (C) 2018--2020 Ivan Baravy <dunkaist@gmail.com>
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <limits.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "shell.h"
|
|
||||||
#include "umka.h"
|
|
||||||
#include "trace.h"
|
|
||||||
|
|
||||||
#define UMKA_DEFAULT_DISPLAY_WIDTH 400
|
|
||||||
#define UMKA_DEFAULT_DISPLAY_HEIGHT 300
|
|
||||||
|
|
||||||
int
|
|
||||||
main(int argc, char **argv) {
|
|
||||||
umka_tool = UMKA_SHELL;
|
|
||||||
const char *usage = \
|
|
||||||
"usage: umka_shell [test_file.t] [-c]\n"
|
|
||||||
" -c collect coverage";
|
|
||||||
const char *infile = NULL;
|
|
||||||
char outfile[PATH_MAX] = {0};
|
|
||||||
FILE *fin = stdin, *fout = stdout;
|
|
||||||
|
|
||||||
kos_boot.bpp = 32;
|
|
||||||
kos_boot.x_res = UMKA_DEFAULT_DISPLAY_WIDTH;
|
|
||||||
kos_boot.y_res = UMKA_DEFAULT_DISPLAY_HEIGHT;
|
|
||||||
kos_boot.pitch = UMKA_DEFAULT_DISPLAY_WIDTH*4; // 32bpp
|
|
||||||
|
|
||||||
// skip 'umka_shell'
|
|
||||||
argc -= 1;
|
|
||||||
argv += 1;
|
|
||||||
|
|
||||||
while (argc) {
|
|
||||||
if (!strcmp(argv[0], "-c")) {
|
|
||||||
argc -= 1;
|
|
||||||
argv += 1;
|
|
||||||
continue;
|
|
||||||
} else if (!strcmp(argv[0], "-i") && argc > 1) {
|
|
||||||
infile = argv[1];
|
|
||||||
strncpy(outfile, infile, PATH_MAX-2); // ".t" is shorter than ".out"
|
|
||||||
char *last_dot = strrchr(outfile, '.');
|
|
||||||
if (!last_dot) {
|
|
||||||
printf("[!] test file must have '.t' suffix\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
strcpy(last_dot, ".out.log");
|
|
||||||
fin = fopen(infile, "r");
|
|
||||||
if (!fin) {
|
|
||||||
perror("[!] can't open file");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
fout = fopen(outfile, "w");
|
|
||||||
if (!fout) {
|
|
||||||
perror("[!] can't open file");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
argc -= 2;
|
|
||||||
argv += 2;
|
|
||||||
continue;
|
|
||||||
} else {
|
|
||||||
printf("bad option: %s\n", argv[0]);
|
|
||||||
puts(usage);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
run_test(fin, fout);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,28 +0,0 @@
|
|||||||
#include <stdio.h>
|
|
||||||
#include "umka.h"
|
|
||||||
|
|
||||||
struct devices_dat_entry {
|
|
||||||
uint8_t fun:3;
|
|
||||||
uint8_t dev:5;
|
|
||||||
uint8_t bus;
|
|
||||||
uint16_t pad1;
|
|
||||||
uint16_t vendor_id;
|
|
||||||
uint16_t device_id;
|
|
||||||
uint32_t irq;
|
|
||||||
uint32_t pad2;
|
|
||||||
};
|
|
||||||
|
|
||||||
STDCALL void
|
|
||||||
dump_devices_dat_iter(struct pci_dev *node, void *arg) {
|
|
||||||
FILE *f = arg;
|
|
||||||
if (node->gsi) {
|
|
||||||
fwrite(&(struct devices_dat_entry){.dev = node->dev,
|
|
||||||
.fun = node->fun,
|
|
||||||
.bus = node->parent->bus,
|
|
||||||
.vendor_id = node->vendor_id,
|
|
||||||
.device_id = node->device_id,
|
|
||||||
.irq = node->gsi},
|
|
||||||
1, sizeof(struct devices_dat_entry), f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
|||||||
#ifndef UTIL_H_INCLUDED
|
|
||||||
#define UTIL_H_INCLUDED
|
|
||||||
|
|
||||||
void dump_devices_dat(const char *filename);
|
|
||||||
|
|
||||||
#endif // UTIL_H_INCLUDED
|
|
@ -1,101 +0,0 @@
|
|||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
#include "umka.h"
|
|
||||||
#include "trace.h"
|
|
||||||
#include "vdisk.h"
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
FILE *file;
|
|
||||||
uint32_t sect_size;
|
|
||||||
uint64_t sect_cnt;
|
|
||||||
unsigned cache_size;
|
|
||||||
int adjust_cache_size;
|
|
||||||
} vdisk_t;
|
|
||||||
|
|
||||||
void *vdisk_init(const char *fname, int adjust_cache_size, size_t cache_size) {
|
|
||||||
FILE *f = fopen(fname, "r+");
|
|
||||||
if (!f) {
|
|
||||||
printf("vdisk: can't open file '%s': %s\n", fname, strerror(errno));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
fseek(f, 0, SEEK_END);
|
|
||||||
off_t fsize = ftell(f);
|
|
||||||
fseek(f, 0, SEEK_SET);
|
|
||||||
size_t sect_size = 512;
|
|
||||||
if (strstr(fname, "s4096") != NULL || strstr(fname, "s4k") != NULL) {
|
|
||||||
sect_size = 4096;
|
|
||||||
}
|
|
||||||
vdisk_t *vdisk = (vdisk_t*)malloc(sizeof(vdisk_t));
|
|
||||||
*vdisk = (vdisk_t){.file = f,
|
|
||||||
.sect_size = sect_size,
|
|
||||||
.sect_cnt = (uint64_t)fsize / sect_size,
|
|
||||||
.cache_size = cache_size,
|
|
||||||
.adjust_cache_size = adjust_cache_size};
|
|
||||||
return vdisk;
|
|
||||||
}
|
|
||||||
|
|
||||||
STDCALL void
|
|
||||||
vdisk_close(void *userdata) {
|
|
||||||
COVERAGE_OFF();
|
|
||||||
vdisk_t *vdisk = userdata;
|
|
||||||
fclose(vdisk->file);
|
|
||||||
free(vdisk);
|
|
||||||
COVERAGE_ON();
|
|
||||||
}
|
|
||||||
|
|
||||||
STDCALL int
|
|
||||||
vdisk_read(void *userdata, void *buffer, off_t startsector,
|
|
||||||
size_t *numsectors) {
|
|
||||||
COVERAGE_OFF();
|
|
||||||
vdisk_t *vdisk = userdata;
|
|
||||||
fseek(vdisk->file, startsector * vdisk->sect_size, SEEK_SET);
|
|
||||||
fread(buffer, *numsectors * vdisk->sect_size, 1, vdisk->file);
|
|
||||||
COVERAGE_ON();
|
|
||||||
return ERROR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
STDCALL int
|
|
||||||
vdisk_write(void *userdata, void *buffer, off_t startsector,
|
|
||||||
size_t *numsectors) {
|
|
||||||
COVERAGE_OFF();
|
|
||||||
vdisk_t *vdisk = userdata;
|
|
||||||
fseek(vdisk->file, startsector * vdisk->sect_size, SEEK_SET);
|
|
||||||
fwrite(buffer, *numsectors * vdisk->sect_size, 1, vdisk->file);
|
|
||||||
COVERAGE_ON();
|
|
||||||
return ERROR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
STDCALL int
|
|
||||||
vdisk_querymedia(void *userdata, diskmediainfo_t *minfo) {
|
|
||||||
COVERAGE_OFF();
|
|
||||||
vdisk_t *vdisk = userdata;
|
|
||||||
minfo->flags = 0u;
|
|
||||||
minfo->sector_size = vdisk->sect_size;
|
|
||||||
minfo->capacity = vdisk->sect_cnt;
|
|
||||||
COVERAGE_ON();
|
|
||||||
return ERROR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
STDCALL size_t
|
|
||||||
vdisk_adjust_cache_size(void *userdata, size_t suggested_size) {
|
|
||||||
vdisk_t *vdisk = userdata;
|
|
||||||
if (vdisk->adjust_cache_size) {
|
|
||||||
return vdisk->cache_size;
|
|
||||||
} else {
|
|
||||||
return suggested_size;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
diskfunc_t vdisk_functions = {
|
|
||||||
.strucsize = sizeof(diskfunc_t),
|
|
||||||
.close = vdisk_close,
|
|
||||||
.closemedia = NULL,
|
|
||||||
.querymedia = vdisk_querymedia,
|
|
||||||
.read = vdisk_read,
|
|
||||||
.write = vdisk_write,
|
|
||||||
.flush = NULL,
|
|
||||||
.adjust_cache_size = vdisk_adjust_cache_size,
|
|
||||||
};
|
|
@ -1,28 +0,0 @@
|
|||||||
#ifndef VDISK_H_INCLUDED
|
|
||||||
#define VDISK_H_INCLUDED
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "umka.h"
|
|
||||||
|
|
||||||
void *vdisk_init(const char *fname, int adjust_cache_size, size_t cache_size);
|
|
||||||
|
|
||||||
STDCALL void
|
|
||||||
vdisk_close(void *userdata);
|
|
||||||
|
|
||||||
STDCALL int
|
|
||||||
vdisk_read(void *userdata, void *buffer, off_t startsector, size_t *numsectors);
|
|
||||||
|
|
||||||
STDCALL int
|
|
||||||
vdisk_write(void *userdata, void *buffer, off_t startsector,
|
|
||||||
size_t *numsectors);
|
|
||||||
|
|
||||||
STDCALL int
|
|
||||||
vdisk_querymedia(void *userdata, diskmediainfo_t *minfo);
|
|
||||||
|
|
||||||
STDCALL unsigned int
|
|
||||||
vdisk_adjust_cache_size(void *userdata, unsigned suggested_size);
|
|
||||||
|
|
||||||
extern diskfunc_t vdisk_functions;
|
|
||||||
|
|
||||||
#endif // VDISK_H_INCLUDED
|
|
@ -1,107 +0,0 @@
|
|||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <inttypes.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include "umka.h"
|
|
||||||
#include "trace.h"
|
|
||||||
#include "vnet.h"
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int fd;
|
|
||||||
} vnet_userdata_t;
|
|
||||||
|
|
||||||
net_device_t *vnet_init(int fd) {
|
|
||||||
// printf("vnet_init\n");
|
|
||||||
vnet_userdata_t *u = (vnet_userdata_t*)malloc(sizeof(vnet_userdata_t));
|
|
||||||
u->fd = fd;
|
|
||||||
|
|
||||||
net_device_t *vnet = (net_device_t*)malloc(sizeof(net_device_t));
|
|
||||||
*vnet = (net_device_t){
|
|
||||||
.device_type = NET_TYPE_ETH,
|
|
||||||
.mtu = 1514,
|
|
||||||
.name = "UMK0770",
|
|
||||||
|
|
||||||
.unload = vnet_unload,
|
|
||||||
.reset = vnet_reset,
|
|
||||||
.transmit = vnet_transmit,
|
|
||||||
|
|
||||||
.bytes_tx = 0,
|
|
||||||
.bytes_rx = 0,
|
|
||||||
.packets_tx = 0,
|
|
||||||
.packets_rx = 0,
|
|
||||||
|
|
||||||
.link_state = ETH_LINK_FD + ETH_LINK_10M,
|
|
||||||
.hwacc = 0,
|
|
||||||
.mac = {0x80, 0x2b, 0xf9, 0x3b, 0x6c, 0xca},
|
|
||||||
|
|
||||||
.userdata = u,
|
|
||||||
};
|
|
||||||
|
|
||||||
return vnet;
|
|
||||||
}
|
|
||||||
|
|
||||||
STDCALL void
|
|
||||||
vnet_unload() {
|
|
||||||
printf("vnet_unload\n");
|
|
||||||
COVERAGE_OFF();
|
|
||||||
COVERAGE_ON();
|
|
||||||
}
|
|
||||||
|
|
||||||
STDCALL void
|
|
||||||
vnet_reset() {
|
|
||||||
printf("vnet_reset\n");
|
|
||||||
COVERAGE_OFF();
|
|
||||||
COVERAGE_ON();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void dump_net_buff(net_buff_t *buf) {
|
|
||||||
for (size_t i = 0; i < buf->length; i++) {
|
|
||||||
printf("%2.2x ", buf->data[i]);
|
|
||||||
}
|
|
||||||
putchar('\n');
|
|
||||||
}
|
|
||||||
|
|
||||||
STDCALL int
|
|
||||||
vnet_transmit(net_buff_t *buf) {
|
|
||||||
net_device_t *vnet;
|
|
||||||
__asm__ __inline__ __volatile__ (
|
|
||||||
"nop"
|
|
||||||
: "=b"(vnet)
|
|
||||||
:
|
|
||||||
: "memory");
|
|
||||||
|
|
||||||
vnet_userdata_t *u = vnet->userdata;
|
|
||||||
printf("vnet_transmit: %d bytes\n", buf->length);
|
|
||||||
dump_net_buff(buf);
|
|
||||||
write(u->fd, buf->data, buf->length);
|
|
||||||
buf->length = 0;
|
|
||||||
COVERAGE_OFF();
|
|
||||||
COVERAGE_ON();
|
|
||||||
printf("vnet_transmit: done\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void vnet_receive_frame(net_device_t *dev, void *data, size_t size) {
|
|
||||||
net_buff_t *buf = kos_net_buff_alloc(size + offsetof(net_buff_t, data));
|
|
||||||
if (!buf) {
|
|
||||||
fprintf(stderr, "[vnet] Can't allocate network buffer!\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
buf->length = size;
|
|
||||||
buf->device = dev;
|
|
||||||
buf->offset = offsetof(net_buff_t, data);
|
|
||||||
memcpy(buf->data, data, size);
|
|
||||||
__asm__ __inline__ __volatile__ (
|
|
||||||
"pushad;"
|
|
||||||
"lea ecx, 1f;"
|
|
||||||
"push ecx;"
|
|
||||||
"push eax;"
|
|
||||||
"jmp kos_eth_input;"
|
|
||||||
"1:"
|
|
||||||
"popad"
|
|
||||||
:
|
|
||||||
: "a"(buf)
|
|
||||||
: "memory", "ecx");
|
|
||||||
}
|
|
@ -1,22 +0,0 @@
|
|||||||
#ifndef VNET_H_INCLUDED
|
|
||||||
#define VNET_H_INCLUDED
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <inttypes.h>
|
|
||||||
#include "umka.h"
|
|
||||||
|
|
||||||
net_device_t *vnet_init(int fd);
|
|
||||||
|
|
||||||
STDCALL void
|
|
||||||
vnet_unload(void);
|
|
||||||
|
|
||||||
STDCALL void
|
|
||||||
vnet_reset(void);
|
|
||||||
|
|
||||||
STDCALL int
|
|
||||||
vnet_transmit(net_buff_t *buf);
|
|
||||||
|
|
||||||
void
|
|
||||||
vnet_receive_frame(net_device_t *dev, void *data, size_t size);
|
|
||||||
|
|
||||||
#endif // VNET_H_INCLUDED
|
|
@ -1,8 +0,0 @@
|
|||||||
#include "pci.h"
|
|
||||||
|
|
||||||
__attribute__((stdcall)) uint32_t pci_read(uint32_t bus, uint32_t dev,
|
|
||||||
uint32_t fun, uint32_t offset,
|
|
||||||
size_t len) {
|
|
||||||
printf("STUB: %s() -> 0", __func__);
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,8 +0,0 @@
|
|||||||
#ifndef PCI_H_INCLUDED
|
|
||||||
#define PCI_H_INCLUDED
|
|
||||||
|
|
||||||
#include "umka.h"
|
|
||||||
|
|
||||||
extern char pci_path[PATH_MAX];
|
|
||||||
|
|
||||||
#endif // PCI_H_INCLUDED
|
|
@ -1,8 +0,0 @@
|
|||||||
void reset_procmask(void) {
|
|
||||||
printf("STUB: %s()", __func__);
|
|
||||||
}
|
|
||||||
|
|
||||||
int get_fake_if(void *ctx) {
|
|
||||||
printf("STUB: %s() -> 0", __func__);
|
|
||||||
return 0;
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user