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')
|
||||
import common
|
||||
|
||||
enable_umka = True
|
||||
|
||||
def log(s, end = "\n"):
|
||||
print(s, end = end, flush = True)
|
||||
|
||||
@ -134,18 +132,6 @@ def collect_tests():
|
||||
tests.append(test_folder_path)
|
||||
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):
|
||||
test_number = 1
|
||||
for test in tests:
|
||||
@ -171,95 +157,6 @@ def run_tests_serially(tests, root_dir):
|
||||
thread.start()
|
||||
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__":
|
||||
root_dir = os.getcwd()
|
||||
|
||||
@ -269,12 +166,7 @@ if __name__ == "__main__":
|
||||
check_tools(tools)
|
||||
|
||||
prepare_test_img()
|
||||
build_umka()
|
||||
tests = collect_tests()
|
||||
umka_tests = collect_umka_tests()
|
||||
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()
|
||||
|
||||
|
@ -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