Commit Graph

6631 Commits

Author SHA1 Message Date
Augustin Cavalier
811da1f129 efi: aarch64 -> arm64. 2018-10-30 22:37:48 -04:00
Alexander von Gluck IV
645e6f89ce u-boot: Drop openfirmware in u-boot platform hack
* If we need this, we can do builds with openfirmware
  platform on u-boot loader now.

Change-Id: I67b5bda165a78b772e246c008c5018b2d6f459e9
2018-10-30 18:06:26 -05:00
Alexander von Gluck IV
c340bfce91 u-boot: Fix boot arch + platform on arm
Change-Id: I6ecdb9e1b1039ac769b015fb96a3531715b44542
2018-10-30 14:51:15 -05:00
Augustin Cavalier
d1f8f8301c kernel: Tolerate "count" argument to memcpy being 0.
It seems GCC2 occasionally will inline a call to memcpy with
a count of 0, which this function did not previously expect
and would result in a "Divide Error Exception."

Hopefully fixes #14613.
2018-10-29 22:44:01 -04:00
Augustin Cavalier
adb4e6e8c5 kernel: Reset lock holder and count on mutex_destroy().
Previously, there were a number of circumstances where these were
not getting reset properly, leading to some destroyed mutexes having
holders of the last thread which locked them, and some with "-1",
which meant that the next call to "mutex_lock" just behaved as if
the lock was still valid (!), and so the unlucky caller would deadlock
forever.

Now we properly reset these fields, which means from now on attempts to
lock or unlock destroyed mutexes will lead to "PANIC: uninitialized mutex"
on KDEBUG kernels, and (as before) an infinite deadlock on non-KDEBUG
kernels (perhaps we should store the thread_id of the locker on non-KDEBUG
kernels also?).

As the next commits will show, this already uncovered a number of bugs,
and there are of course potentially more strange deadlocks caused by this.
2018-10-29 00:53:41 -04:00
Alexander von Gluck IV
8ee963f940 efi: Begin sorting x86_64 to arch subfolder
Change-Id: I0b724c05d527332fb6a5f4909b44d578ae1c6d0e
2018-10-28 16:43:50 -05:00
Alexander von Gluck IV
ee2c12f4c8 boot/openfirmware: Add missing KERNEL_PLATFORM headers
Change-Id: I408a0b6d94cf7ac7d968e6d7e5dccd4e8920ab12
2018-10-19 15:35:48 -05:00
Alexander von Gluck IV
8522edfe36 jam: Ensure common boot LDFLAGS and ASFLAGS get distributed 2018-10-19 08:55:41 -05:00
Alexander von Gluck IV
49223f54a7 system/boot: Tab cleanup, sorry for spam
Change-Id: If486b772f5d0d1f22ba7cf08363e9a16434b3912
2018-10-18 10:53:55 -05:00
Alexander von Gluck IV
dd45d433ed u-boot: Fix after multi-loader changes
* Move MMU image to a real image define vs being crammed into
  the u-boot bootloader Jamfile
* ARM not working yet, but better!
* x86 still builds

Change-Id: I3fb873dbac06fe2db893915b667bf3ce1df44686
2018-10-18 10:49:59 -05:00
Alexander von Gluck IV
2ff03651b7 efi: Fix missing gnuefi dependency
Change-Id: Iff3b64e781ebee192b769193808f3ec12af1d1fa
2018-10-17 21:21:13 -05:00
Augustin Cavalier
e39df8a97c bios_ia32: Remove some extra debug info. 2018-10-17 17:54:57 -04:00
Alexander von Gluck IV
4124da508a bios_ia32: Fix hdd stage1 boot
* haiku_loader is the hpkg name in system/packages and not the
  loader name.
* bios_ia32 stage1 assumes the bios_ia32 loader is the first
  file in haiku_loader.hpkg. This isn't ideal.. but space in
  stage1 is *limited*
2018-10-17 14:47:54 -05:00
Jessica Hamilton
1f96a3cbde system/boot: Add support for multiple bootloaders 2018-10-17 14:47:46 -05:00
Augustin Cavalier
80be7d09c5 kernel: Handle the user buffers properly in _user_xsi_semctl.
Should fix #14512.
2018-09-23 14:45:01 -04:00
Augustin Cavalier
c609f04f86 kernel: Print interrupt line when assuming no interrupt use on PCI device. 2018-09-23 14:19:25 -04:00
Augustin Cavalier
7d8b7501ba kernel: Treat 255 as an invalid interrupt line on x86.
From mmlr's analysis in #13370 comment:22: "We actually do ignore a missing
routing in case the interrupt line is 0. In this case it isn't 0 but 0xff,
which is invalid and generally treated the same as 0 in the rest of the code.
Ignoring the missing routing on 0xff seems like the way to go here."

Indeed, I managed to locate a footnote in the PCI 3.0 specification which
confirms that this is the case on x86, and a commit in the Linux kernel
which essentially does the same thing this change does:
https://github.com/torvalds/linux/commit/e237a5518425155faa508a087f2826
Interestingly, that commit is only from 2016, while PCI 3.0 is from 2004.

This probably fixes #13370 ("Haiku doesn't MBR boot on Ryzen"), and potentially
other interrupt-routing-related boot failures.

Change-Id: I88129f6507c62d24cb50cf5c78597ca7bd7872d7
Reviewed-on: https://review.haiku-os.org/590
Reviewed-by: waddlesplash <waddlesplash@gmail.com>
2018-09-22 20:50:34 +00:00
Augustin Cavalier
753e006611 kernel: Include the area name and ID in the "attempting to clone" panic message.
Change-Id: Iecc842047929531f8feb7304fbcd1a8f2b28ab2f
Reviewed-on: https://review.haiku-os.org/584
Reviewed-by: waddlesplash <waddlesplash@gmail.com>
2018-09-18 20:03:00 +00:00
Michael Lotz
99888f6b69 kernel: Apply user iframe determination logic to SMAP/SMEP.
Change-Id: I394492a289f01303ac28e6d6670fbfdb326fa4db
Reviewed-on: https://review.haiku-os.org/561
Reviewed-by: Axel Dörfler <axeld@pinc-software.de>
2018-09-14 10:09:10 +00:00
Michael Lotz
8c005190c4 kernel: Determine kernel vs. user page fault depending on iframe.
The action vm_page_fault takes should depend on whether the iframe to be
handled is a user iframe or not. The check for the user flag in the
error code does however only check if the fault happend in user or
kernel space. Use IFRAME_IS_USER() instead which checks the privilege
level of the iframe. Under 32 bit x86 this also handles vm86
compatibility mode properly.

This is the same logic as used on FreeBSD (TRAPF_USERMODE).

Fixes #13930.

Change-Id: I9c348b6ab4c60daaaaa2c0fe33bcc3336aa29f7b
Reviewed-on: https://review.haiku-os.org/560
Reviewed-by: Axel Dörfler <axeld@pinc-software.de>
2018-09-14 10:08:03 +00:00
Michael Lotz
0de5a83940 Cleanup: Use symbolic names, compare != 0 and whitespace.
Change-Id: I34c60b3ab8387fe57dbcd91f9b5d278468455cf6
Reviewed-on: https://review.haiku-os.org/559
Reviewed-by: waddlesplash <waddlesplash@gmail.com>
2018-09-14 10:04:54 +00:00
Augustin Cavalier
4d5c5a7e66 libroot: More RETURN_AND_SET_ERRNO cleanup.
No functional change intended.
2018-09-13 16:05:22 -04:00
Augustin Cavalier
77d2c1df0e libroot: Use RETURN_AND_SET_ERRNO from the utils header in ioctl.
No functional change intended.

Change-Id: I5e6a060fe8e036bc4d4b8b8cc95a4e8d0ea00f81
Reviewed-on: https://review.haiku-os.org/549
Reviewed-by: waddlesplash <waddlesplash@gmail.com>
2018-09-13 04:13:19 +00:00
Augustin Cavalier
74e882b39b kernel/fs: Flush the underlying device's write cache as part of sync().
BFS does this as part of journal management, but not as part of block
cache synchronization (which makes sense, as flushing it then would
defeat the purpose of the drive's write cache.) No other file system
seems to touch it at all, so we should do it as part of an explicit sync.

This may help with some of the filesystem corruption issues, as it seems
that on slow disks, the drive might not have enough time to flush the cache
before it is powered off (or on some SATA/AHCI based disks, it is not flushed
before close at all), so triggering it here and, as the ioctl is supposed to be
synchronous, waiting for it also, seems to make sense.

Change-Id: I7d9992c21ca4b59c839711dcc96c973b4b8df052
Reviewed-on: https://review.haiku-os.org/530
Reviewed-by: Jérôme Duval <jerome.duval@gmail.com>
Reviewed-by: waddlesplash <waddlesplash@gmail.com>
2018-09-11 20:06:58 +00:00
Augustin Cavalier
f960901a70 EFI: Use proper mnemnoic for retf (lret) to appease Clang. 2018-09-08 18:56:33 -04:00
Nikolas Zimmermann
0e9dc76e5f Fix build with DEBUG_PAGE_QUEUE enabled
Change-Id: Id9ffcd50835a0ba9e4276a3bb5939cc1d4afa128
Reviewed-on: https://review.haiku-os.org/516
Reviewed-by: Stephan Aßmus <superstippi@gmx.de>
2018-09-06 07:46:25 +00:00
Augustin Cavalier
0df493a13a libroot: Fix handling of debugger() call in abort().
The kernel's handling of SIGABRT is just to terminate the application
immediately without doing anything else (it only notifies the debugger if
there's one installed for this application already.) More serious faults
(e.g. SIGSEGV) originate in the kernel and handle this logic before they
even invoke the signal handler.

So the correct solution is to do the same here in libroot. This incurs
a very, very slight performance penalty of the syscall time for sigaction(),
though I expect whatever applications are causing SIGABRT to be invoked more
than once a second will call raise() directly instead of abort()...
2018-09-02 00:13:40 -04:00
Augustin Cavalier
0217e08a63 vfs: panic() if volume->ops is NULL but status == B_OK.
This panic, unlike the NULL dereference that would otherwise occur, is
at least continuable.
2018-08-21 21:22:52 -04:00
Augustin Cavalier
b2cb85f4d5 libroot: New memcpy for ARM.
It seems the old one was just broken (see mailing list discussion.)

This new one was built from the generic one, but it was done using
a trunk build of Clang 8 with tuned optimization flags, and is
smaller (101 instructions) than GCC 8's (134 instructions) and
the old hand-optimized one (~125 instructions?) as well as being
targeted for ARMv7 instead of ARMv6 like the old one was.

In the future, we may want to look at newlib's ARM memcpy, which
is probably much more hand-optmized than this one is, but this
is at least better than what we had before.
2018-08-20 11:53:47 -04:00
Jérôme Duval
ee692b38b2 x86_64: R_X86_64_PC32 and R_X86_64_DTPOFF32 are 32-bit wide relocations.
Change-Id: I9c4e6c5ae77f4c17c2b6901f2b133db4b9dc48e3
Reviewed-on: https://review.haiku-os.org/445
Reviewed-by: waddlesplash <waddlesplash@gmail.com>
2018-08-15 16:16:20 +00:00
Kacper Kasper
fe8b46fb0d kernel: vm: add unit tests for get_mount_point
Change-Id: I1eb7540ffadb26acf05b695af2e7508c71ac7274
Reviewed-on: https://review.haiku-os.org/460
Reviewed-by: waddlesplash <waddlesplash@gmail.com>
2018-08-15 16:14:18 +00:00
Augustin Cavalier
552fabf1ad libroot: Merge some changes to longlong.h for ARM from upstream.
Gets the ARM/Clang build all the way to the libroot linking stage.
2018-08-15 00:11:30 -04:00
Augustin Cavalier
581da829b5 libroot: ARM does not have regparm.
Also fix the test for USE_REGPARMS in the same file. Gets the Clang
build somewhat further.
2018-08-15 00:10:33 -04:00
Alexander von Gluck IV
9ae04563d6 framebuffer/bcm2835: Check for available mailbox
Change-Id: I6f158335c4bdda108c13c26f62bfd8d814ea1b3f
2018-08-14 16:58:17 -05:00
Alexander von Gluck IV
b795602253 boot/mmu: Fix hrev52228. No returns from mmu_identity_map.
* Pretty sure Jam didn't compile the changes to this file.

Change-Id: I9dccd24e523d5bd575565f1768314a9d8f2be1ab
2018-08-14 16:26:58 -05:00
Alexander von Gluck IV
a6cb002e99 boot/mmu: Consolidate some fdt mapping functions
* Realized we already had a function which iterates over
  an fdt node and maps it's memory regs. Make it work for
  physical mappings or identity mappings.

Change-Id: I0e3e323798bc2dfcead1accc1d403b30a8ab188f
2018-08-14 16:16:01 -05:00
Augustin Cavalier
ab39ceb10c system/glue: Add a crtbegin and crtend implementation.
GCC provides these but Clang does not; these come from the ones Clang
was going to provide, but decided against it in favor of letting libc vendors
distribute them instead, hence the license headers.

For now, they are only enabled when building with Clang, as we still use GCC's
versions otherwise. But I've tested them with apps built with GCC 7 (as Clang
builds are still too broken at present) and they seem to work just fine. (They
will not build with GCC 2 of course, due to how they use __attribute__.)
2018-08-14 16:07:03 -04:00
Humdinger
deeaee6fc9 Boot options: add help text to state selection
To indicate this is a menu you can enter to select a previous
state to boot. Also rename "Latest version" to "Latest state" as
that is more correct.
Thanks waddlesplash for pointers.

Fixes #14362
2018-08-14 21:11:16 +02:00
Augustin Cavalier
f2015c2f81 boot/platform/cfe: Remove, unused.
All platforms it was theoretically useful for also have U-Boot.
OK'd by mmu_man.
2018-08-11 20:21:12 -04:00
Augustin Cavalier
376472a816 libroot: Some fixes for Clang ARM builds. 2018-08-11 15:26:08 -04:00
Alexander von Gluck IV
3718fb861d efi: Drop x86_64 assumptions.
Change-Id: I3d806f43ef951013369fd0bf906eca5977e8d34c
2018-08-08 10:18:06 -05:00
Alexander von Gluck IV
572030aca6 kernel/efi: Add efi platform
Change-Id: Ie3cc4b4652d56983147221db9fbee6b72f177b1b
2018-08-08 09:48:34 -05:00
Augustin Cavalier
023a547dc6 vm: Enable B_USER_CLONEABLE_AREA protection.
Spotted while reading through the VM code while thinking about how to
implement vfork().

When axeld disabled this in 2005 (!), Haiku's kernel was still young,
BeOS drivers were still "a thing," and there was no distinction in this
function from being called by the kernel / not by the kernel.

Now, it's 2018, we manage all drivers ourselves, have SMAP enabled by
default when available, and as axeld recently noted on the mailing lists,
"there's not much reason we still use GCC2 for the kernel anyway." So we
probably don't care about any BeOS drivers that may be broken by this
(are there any still around?)

Besides the usual fixes to get this 13-year-old chunk to work again, there
are two functional changes:
  1) Allow the kernel to clone whatever it likes into the user's address space.
     It seems that this is often done legitimately (e.g. team creation), and
     so attempting to distinguish those cases seems more work than it may be
     worth right now.

     The disadvantage is that drivers without proper checks may be "tricked"
     into cloning areas they shouldn't; but I'm guessing if that's the case,
     then something else is probably broken and the driver should be fixed.
     It seems the reverse case (cloning a userland area into the kernel)
     is much more common (in fact, it looks like all 4 of the 4 places
     where clone_area is used in kernel-space outside the kernel itself
     are doing this.)

 2) At KDEBUG_LEVEL 2 and higher, throw a panic when attempting to clone
    an area that does not have the protection flag set. This should make
    finding any bugs exposed by this change much easier than "hardware doesn't
    work" / "black screen on boot" / etc., as well as any potential future
    bugs introduced in the process of driver development.
2018-08-06 23:27:50 -04:00
Alexander von Gluck IV
91bc3a279a kernel/ppc: Fix PowerPC build after fdt changes
Change-Id: Ieccec192c9d257368f8a9b5c52d01ed3c1c66d23
2018-08-06 19:55:48 -05:00
Kacper Kasper
f26398d462 kernel: vm: remove panic
* That's embarrassing.
2018-08-06 23:09:05 +02:00
Kacper Kasper
7cea6679a8 kernel: vm: fix off-by-one errors in get_mount_point
* Fix for 03df8bfcf2.
* Fix misleading indentation.
* Fixes #14225.
2018-08-06 23:07:27 +02:00
Jérôme Duval
c90a0ee947 posix_spawn(): dup2() again this time on file_action_dup2.
* fixes #14322.
2018-08-06 19:13:32 +02:00
Alexander von Gluck IV
5d0fd0e422 fdt: Major over-haul of fdt
* Consolidate all fdt code into fdt bus_manager
* Build boot and kernel static libraries

Change-Id: I2a69cd7e1f1276999a80734ff12918fd49b599e5
Reviewed-on: https://review.haiku-os.org/440
Reviewed-by: Alexander von Gluck IV <kallisti5@unixzen.com>
2018-08-06 15:46:49 +00:00
Alexander von Gluck IV
c3f9610748 arm/mmu: First iteration at mapping peripherals from FDT
* This fixes booting Haiku on Raspberry Pi and qemu (-M raspi2)
* Makes several assumptions which need corrected.
  /axi is broadcom only
  size is fixed
* The final solution will be "probing" each simple-bus device
  from the fdt. A lot of fdt support code needs written though
  for "finding" compatible devices and determining the full size
  of the devices in memory.

Change-Id: Ifd5fbab7490c8456247115f5aada618909f1bb9e
2018-08-06 08:57:15 -05:00
Augustin Cavalier
daad9a3c1c kernel: Revert MMC bus changes to device_manager.
This broke booting on most (all?) systems.
2018-08-05 21:56:54 -04:00