Commit Graph
98 Commits
Author SHA1 Message Date
Alex Smith c8049a88a3 Enabled hardware interrupt handler, timers now work and threads are preempted. 2012-07-09 17:42:34 +01:00
Alex Smith b5c9d24abc Implemented threading for x86_64.
* Thread creation and switching is working fine, however threads do not yet
  get interrupted because I've not implemented hardware interrupt handling
  yet (I'll do that next).
* I've made some changes to struct iframe: I've removed the e/r prefixes
  from the member names for both 32/64, so now they're just named ip, ax,
  bp, etc. This makes it easier to write code that works with both 32/64
  without having to deal with different iframe member names.
2012-07-09 16:43:01 +01:00
Alex Smith 85d4a8bc4e Fixed compilation of C code using ELF headers. 2012-07-09 14:35:01 +01:00
Alex Smith 8c5e747190 Don't need to shift the factor in system_time(), just store the already shifted value. 2012-07-09 12:25:49 +01:00
Alex Smith 5e9bb17da7 Renamed remaining i386_* functions to x86_* for consistency. 2012-07-09 12:14:18 +01:00
Alex Smith ee7aba5117 Print symbol information in a stack trace. 2012-07-09 11:54:03 +01:00
Alex Smith 3b802628b8 Support ELF64 in the kernel.
This has been done by adding typedefs in elf_common.h to the correct ELF
structures for the architecture, and changing all Elf32_* uses to those
types. I don't know whether image loading works as I cannot test it yet,
there may be some 64-bit safety issues around. However, symbol lookup for
the kernel is working correctly.
2012-07-09 11:11:38 +01:00
Alex Smith bc3093488f Changes suggested by Ingo: style fix, and a system_time optimization. 2012-07-09 09:03:11 +01:00
Alex Smith 93cba1da96 Fixed a bug resulting from a mistake in the boot 64-bit paging setup.
This was an interesting bug to find. Was getting spurious triple faults
in the slab allocator. The problem was that the boot paging setup code
was mapping all page tables it created into the virtual address space,
but in the kernel no areas were being created to cover them, so during
arch_vm_init_end() the pages for them ended up being freed and then
overwritten later on. Fixed by unmapping page tables after populating
them in long_mmu_init().
2012-07-08 15:03:23 +01:00
Alex Smith cc248cf2b3 A couple of bug fixes.
* mmu_get_virtual_mapping() should check that the page directory entry is
  present rather than assuming there's a page table there. This was resulting
  in some invalid mappings being created in the 64-bit virtual address space.
* arch_vm_init_end() should clear from KERNEL_LOAD_BASE to virtual_end, not
  from KERNEL_BASE. On x86_64 this was causing it to loop through ~512GB of
  address space, which obviously was taking quite a while.
2012-07-08 11:56:06 +01:00
Alex Smith 5c7d52183c Implemented system_time() for x86_64.
* Uses 64-bit multiplication, special handling for CPUs clocked < 1 GHz
  in system_time_nsecs() not required like on x86.
* Tested against a straight conversion of the x86 version, noticably
  faster with a large number of system_time() calls.
2012-07-08 10:16:44 +01:00
Alex Smith 7444a55ce5 Merge branch 'master' into x86_64 2012-07-06 15:55:59 +01:00
Alex Smith c15176264b Compile APIC and timer code for x86_64, and create an area for the IDT. 2012-07-06 15:24:02 +01:00
Alex Smith 15feb60325 A few improvements suggested by Ingo. 2012-07-06 14:34:50 +01:00
Alex Smith 84bf29f97b Compile in arch_platform.cpp for x86_64. The apm_init call is disabled for x86_64, APM is 32-bit only. 2012-07-06 14:17:48 +01:00
Alex Smith ab7726a2c4 Temporary fix for create_preloaded_image_areas. Will be replaced with a typedef later on. 2012-07-06 14:04:07 +01:00
Alex Smith e276cc0457 Finished implementation of x86_64 paging.
* vm_init now runs up until create_preloaded_image_areas(), which needs
  fixing to handle ELF64.
* Not completely tested. I know Map(), Unmap() and Query() work fine, the
  other methods have not been tested as the kernel doesn't boot far enough
  for any of them to be called yet. As far as I know they're correct, though.
* Not yet implemented the destructor for X86VMTranslationMap64Bit or Init()
  for a user address space.
2012-07-06 12:52:35 +01:00
Alex Smith 11d35d1b9b Fixed tracing printf formats in VM code. 2012-07-05 20:17:31 +01:00
Alex Smith 1671cfdf2c Improved stack tracer, traces over iframes. 2012-07-05 16:11:11 +01:00
Alex Smith 898b29e362 Added temporary stack trace function to x86_64.
Will be merged with the x86 one later on. Requires -fno-omit-frame-pointer on
the kernel build flags, GCC defaults to not generating stack frames on x86_64.
2012-07-05 15:35:43 +01:00
Alex Smith 0da10c8b51 Some fixes to the long mode switch code.
* Wasn't storing the fixed virtual address of the PML4 in kernel_args.
* After switching to long mode, reload GDTR with the virtual address of
  the GDT. This was working fine until now because the physical address
  was identity mapped, but broke as soon as I removed the identity
  mapping.
2012-07-05 13:55:59 +01:00
Alex Smith 2f36ef5afe Fixed the x86_64 setjmp implementation.
* typedef for jmp_buf was using int where it should be long.
* setjmp was clearing the buffer pointer rather than the signal mask before
  calling sigsetjmp.
* KDL now works without crashing on x86_64.
2012-07-05 13:52:36 +01:00
Alex Smith 78d482e3b8 Style fixes. 2012-07-05 09:10:50 +01:00
Alex Smith d687d8ac70 Implementation of VMPhysicalPageMapper for x86_64 using the permanent physical memory mapping. 2012-07-04 19:57:48 +01:00
Alex Smith 40aeaeb907 Should enable CR4.PGE while switching to the kernel. 2012-07-04 18:39:23 +01:00
Alex Smith a8f85e6e48 Removed accidently left in debug message. 2012-07-04 18:33:21 +01:00
Alex Smith e70dd7e0af Map all physical memory in the long mode paging setup.
Since x86_64 has such a large virtual address space all available physical
memory can be mapped in to it. The physical page mapper implementation for
x86_64 will use this mapping. Also changed the mapping code to map kernel
pages with the global flag.
2012-07-04 18:28:50 +01:00
Alex Smith 950b24e32d Begun work on VMTranslationMap implementation for x86_64.
* Added empty source files for all the 64-bit paging method code, and a
  stub implementation of X86PagingMethod64Bit.
* arch_vm_translation_map.cpp has been modified to use X86PagingMethod64Bit
  on x86_64.
2012-07-04 17:08:44 +01:00
Alex Smith 4988ca58a0 Build arch_vm.cpp for x86_64. No changes required except for temporarily disabling bios_init call. 2012-07-04 14:55:11 +01:00
Alex Smith 428b9e758c Check whether gX86PagingMethod is NULL in arch_vm_translation_map_is_kernel_page_accessible.
This means that the kernel debugger won't cause a recursive panic if a
panic occurs before vm_init().
2012-07-04 14:23:35 +01:00
Alex Smith 4304bb9894 Added arch_cpu.cpp to the x86_64 build.
* Some things are currently ifndef'd out completely for x86_64 because
  they aren't implemented, there's a few other ifdef's to handle x86_64
  differences but most of the code works unchanged.
* Renamed some i386_* functions to x86_*.
* Added a temporary method for setting the current thread on x86_64
  (a global variable, not SMP safe). This will be changed to be done
  via the GS segment but I've not implemented that yet.
2012-07-04 14:06:46 +01:00
Alex Smith 4e8fbfb2d1 x86_{read,write}_cr{0,4} can just be implemented as macros, put an x86_ prefix on the other read/write macros for consistency. 2012-07-03 20:55:36 +01:00
Alex Smith cbfe5fcd17 Removed redundant x86 sources/headers. 2012-07-03 17:38:18 +01:00
Alex Smith c005e747ef Removed the x86_64 headers/source directories, now all merged with x86. 2012-07-03 11:17:56 +01:00
Alex Smith 4f419b518f Merged in the x86_64 exception handling.
I've split the 32-bit dependent IDT setup code and ASM interrupt handlers to
the 32 subdirectory, arch_int.cpp now contains only the generic hardware
interrupt handling code.
2012-07-03 11:13:51 +01:00
Alex Smith 22fe9b20f5 Merge branch 'master' into x86_64 2012-07-03 08:46:52 +01:00
Alex Smith 90907c35ac Moved ELF64 relocation functions to x86 arch_elf.cpp. 2012-07-03 08:45:35 +01:00
Alex Smith 020a25ce46 Fixed x86_64 kernel compilation.
For now I've just put all the stub functions that are needed to link the
kernel into a file called stubs.cpp. I've not yet moved across the interrupt
handling code or the ELF64 relocation code to the x86 directory. Once those
have been moved I can get rid of the x86_64 headers/source directories.
2012-07-02 20:56:27 +01:00
Alex Smith 0897e314b7 Merged x86_64 headers into x86 headers.
Not many changes seeing as there's not much x86_64 stuff done yet. Small
differences are handled with ifdefs, large differences (descriptors.h,
struct iframe) have separate headers under arch/x86/32 and arch/x86/64.
2012-07-02 18:47:06 +01:00
Alex Smith da80a0500c Preparation for merge of x86 and x86_64 kernel sources.
Since x86 and x86_64 share a lot of common code, x86_64 kernel sources/headers
are going to reside under headers/private/kernel/arch/x86 and
src/system/kernel/arch/x86 along with the existing x86 code. This commit
changes the build system to handle this. A new variable, TARGET_KERNEL_ARCH,
has been added. This is the name of the kernel/boot architecture directory
name, set to x86 on both x86 and x86_64. This is now used in all places where
TARGET_ARCH was used to get to kernel arch sources/headers (I've changed
everything necessary as far as I can tell). Kernel won't build for x86_64
at the moment as the sources have not been merged, loader does.
2012-07-02 14:07:49 +01:00
Alex Smith 4f78437c0d Style fix. 2012-07-02 10:13:37 +01:00
Alex Smith 120585d549 Merge branch 'master' into x86_64 2012-07-02 09:39:42 +01:00
Alex Smith 294711f98c Changed {,u}int64 to be long rather than long long on x86_64. 2012-06-28 12:36:45 +01:00
Alex Smith 0705884ac4 Style fixes. 2012-06-27 15:48:39 +01:00
Alex Smith c9f6d2271f x86_64: Implemented exception handling. 2012-06-27 15:18:10 +01:00
Alex Smith 014f4403ee Use unsigned long, not uint32, for the 'l' qualifier in printf() - long is 64-bit on x86_64. 2012-06-27 15:11:06 +01:00
Alex Smith 45e0e08aed Made panic() safe to use before the current thread has been set. 2012-06-27 15:07:45 +01:00
Alex Smith 575a67c7a1 Merge branch 'master' into x86_64 2012-06-27 11:28:28 +01:00
Alex Smith 3403f23e81 Moved the common parts of arch_cpu.h between x86 and x86_64 to arch/common_x86/cpu.h. 2012-06-27 11:23:54 +01:00
Alex Smith 3f017e9061 Also need to fix the kernel_args_range addresses. 2012-06-27 10:33:31 +01:00
Alex Smith b8a9a3a160 Copied the x86 debug console functions to x86_64.
Note that this is only temporary so that I have serial output from the kernel,
the x86 and x86_64 versions will be merged later.
2012-06-26 11:42:28 +01:00
Alex Smith 991e5bee90 Pass correct kernel_args address to the kernel. 2012-06-26 11:27:00 +01:00
Alex Smith e5fc2bfcab Implemented long mode setup/switch code, the bootloader can now start the 64-bit kernel!
The setup procedure is fairly simple: create a 64-bit GDT and 64-bit page
tables that include all kernel mappings from the 32-bit address space, but at
the correct 64-bit address, then go through kernel_args and changes all virtual
addresses to 64-bit addresses, and finally switch to long mode and jump to the
kernel.
2012-06-26 11:08:21 +01:00
Alex Smith a820f12943 Style fixes to elf.cpp. 2012-06-26 10:59:03 +01:00
Alex Smith 5a17b2f1b2 Forgot to change driver_settings_file to use FixedWidthPointer. 2012-06-26 10:54:37 +01:00
Alex Smith f69dd487b1 Fixed x86 GCC2 build. 2012-06-25 13:28:28 +01:00
Alex Smith 6f6d78e877 Cleaned up ELF64 address handling.
* platform_allocate_elf_region() is removed, it is implemented in platform-
  independent code now (ELF*Class::AllocateRegion). For ELF64 it is now
  assumed that 64-bit addresses are mapped in the loader's 32-bit address space
  as (address - KERNEL_BASE_64BIT + KERNEL_BASE).
* mapped_delta field from preloaded_*_image removed, now handled compile-time
  using the ELF*Class::Map method.
* Also link the kernel with -z max-page-size=0x1000, removes the need for
  2MB alignment on the data segment (not going to map the kernel with large
  pages for the time being).
2012-06-25 13:00:50 +01:00
Alex Smith 8846189866 Handle 64-bit load addresses for ELF64 images in the bootloader.
The ELF loader now uses a new platform function, platform_allocate_elf_region,
which returns 2 addresses: the real load address and an address where the
region is mapped in the loader's address space. All of the ELF loading code
has been changed to access the load region through the mapped address rather
than the addresses contained in the ELF image. The ELF64 version of
platform_allocate_elf_region on x86 uses the existing MMU code, which maps
everything at 0x80000000, but returns the correct 64-bit address. The long
mode switch code will just set up the 64-bit address space with everything
remapped at the correct address.
2012-06-24 22:57:48 +01:00
Alex Smith f6a3444449 Added x86_64 ELF64 relocation functions for the bootloader. All that's left to do now is handle the 64-bit load address properly. 2012-06-24 19:22:33 +01:00
Alex Smith c2656eb9bd Improved elf_load_image() a bit.
After enabling BOOT_SUPPORT_ELF64 on x86 the x86 kernel could no longer be
booted because too many kernel_args allocations were taking place and filling
kernel_args_ranges. This was because for each image load it would check if
the image is ELF64, fail and fall back to ELF32 (each ELF64 check allocated
a preloaded_image). Changed elf_load_image() so that it only tries both when
loading the kernel image, and then for modules it will only try the same ELF
class as the kernel image.
2012-06-24 17:58:22 +01:00
Alex Smith 035825cdfc Align the start of the kernel .data to a 2MB boundary, prevents ld from merging the text and data PHDRs. 2012-06-24 17:19:48 +01:00
Alex Smith acda52f5e9 Fixes for other platforms. 2012-06-24 15:48:03 +01:00
Alex Smith ccadfaeeb5 Changed the boot ELF code to use templates and added ELF64 support.
The actual implementation of the ELF loading methods have been put into
an ELFLoader template class that takes a single template parameter, which
is a structure containing all the necessary ELF typedefs. It's a bit
verbose, but I thought it was a neater solution than using a bunch of
standalone functions with a huge number of template parameters. There is
no change to code outside of elf.cpp, the ELF32/ELF64 differences are
handled internally.
2012-06-23 12:05:16 +01:00
Alex Smith 3a2a3367dc Support static_cast on FixedWidthPointer. 2012-06-22 19:55:38 +01:00
Alex Smith f124497815 Added an ELF64 version of preloaded_image.
* There is now 2 structures, preloaded_elf32_image and preloaded_elf64_image,
  which both inherit from preloaded_image.
* For now I've just hardcoded in use of preloaded_elf32_image, but the
  bootloader ELF code will shortly be converted to use templates which use
  the appropriate structure. The kernel will be changed later when I add
  ELF64 support to it.
* All kernel_args data is now compatible between 32-bit and 64-bit kernels.
2012-06-22 19:24:51 +01:00
Alex Smith 62d36f9833 Removed the addr_t conversion operators from FixedWidthPointer which makes comparison against NULL work properly. 2012-06-22 18:22:11 +01:00
Alex Smith 474aa3b76e Added ELF64 headers, common ELF32 and ELF64 definitions moved to elf_common.h. 2012-06-22 12:54:41 +01:00
Alex Smith 6b87898af5 Code style fixes. 2012-06-22 11:56:55 +01:00
Alex Smith 17e407e945 Proper implementation of arch_kernel.h for x86_64. 2012-06-22 10:53:08 +01:00
Alex Smith 1651dd72d9 Merge branch 'master' into x86_64 2012-06-21 19:48:43 +01:00
Alex Smith 17a3389882 Remove phys_addr_range, just use addr_range for both virtual and physical address ranges (as requested by Ingo). 2012-06-21 19:48:03 +01:00
Alex Smith 5915eeb461 Some improvements to the previous changes made to vfs_boot.cpp suggested by Ingo. 2012-06-21 19:45:36 +01:00
Alex Smith d8efc6caf6 Changes to kernel_args to make it identical for x86 and x86_64.
* Added a FixedWidthPointer template class which uses 64-bit storage to hold
  a pointer. This is used in place of raw pointers in kernel_args.
* Added __attribute__((packed)) to kernel_args and all structures contained
  within it. This is necessary due to different alignment behaviour for
  32-bit and 64-bit compilation with GCC.
* With these changes, kernel_args will now come out the same size for both
  the x86_64 kernel and the loader, excluding the preloaded_image structure
  which has not yet been changed.
* Tested both an x86 GCC2 and GCC4 build, no problems caused by these changes.
2012-06-21 18:02:23 +01:00
Alex Smith 192af9e0af Changed addr_range to use uint64.
I've tested this change on x86, causing no issues. I've checked over the code
for all other platforms and made the necessary changes and to the best of my
knowledge they should also still work, but I haven't actually built and
tested them. Once I've completed the kernel_args changes the other platforms
will need testing.
2012-06-20 14:11:24 +01:00
Alex Smith 93cb9538be Don't store a KMessage in kernel_args for the boot volume, only the buffer address/size.
Pointers in kernel_args are going to be changed to unconditionally use 64-bit
storage (to make kernel_args compatible with both the x86 and x86_64 kernels).
KMessage stores a pointer to its buffer, however since KMessage is used
outside of the boot code it is undesirable to change it to use 64-bit storage
for the pointer as it may add additional overhead on 32-bit builds. Therefore,
only store the buffer address and size and then construct a KMessage from
those in the kernel.
2012-06-20 11:53:47 +01:00
Alex Smith 7417d5ed8d Made the bootloader search for both kernel_x86 and kernel_x86_64 when built for x86 or x86_64. 2012-06-20 10:44:38 +01:00
Alex Smith cfd1c1802f Add -march=pentium to boot {CC,C++}FLAGS on x86_64, prevents GCC from generating SSE code. 2012-06-19 21:54:40 +01:00
Alex Smith 7c488bff70 Modified the floppy boot image target so that it can be used to build an x86_64 boot image.
* set_haiku_revision doesn't currently support ELF64, don't use a
  revisioned kernel image on x86_64 for now.
* Don't try to build add-ons for x86_64 yet.
2012-06-19 21:36:13 +01:00
Alex Smith e114f50ddd Fixed bootloader build under x86_64. 2012-06-19 20:38:53 +01:00
Alex Smith 6296722bc0 Fixed incorrect link address in kernel linker script. 2012-06-16 11:20:05 +01:00
Alex Smith 043c61dde5 Added stub versions of everything needed to build the kernel.
The whole kernel now builds and there are no undefined references when
linking, I just need to fix some strange relocation errors I'm getting
(probably a problem with the linker script) and then I'll have a kernel
image.
2012-06-15 22:50:59 +01:00
Alex Smith 146f966921 Fixed a mistake in 11d3892, changed a parameter type to addr_t that shouldn't have been changed. 2012-06-15 22:31:24 +01:00
Alex Smith 8c0e3c951a Add -mno-red-zone to the kernel CCFLAGS/C++FLAGS.
The red zone is a 128-byte area below the stack pointer specified by the
AMD64 ABI that can be used by leaf functions for their stack frame without
modifying the stack pointer. It is guaranteed not to be modified by signal
handlers. This cannot be used in kernel mode code, as an interrupt handler
could overwrite it, so stop GCC from generating code that uses it.
2012-06-15 20:05:25 +01:00
Alex Smith 73f27ecd3a Implementations of some libroot functions for x86_64.
These are the functions required by the kernel. These are all full
implementations except for system_time(), which will be implemented later.
2012-06-15 19:57:21 +01:00
Alex Smith f4f0f79b66 Merge branch 'master' into x86_64 2012-06-15 16:10:53 +01:00
Alex Smith 82b4b37172 Added a TODO in to say that {,u}int64 should be changed to long on x86_64. 2012-06-15 16:09:25 +01:00
Alex Smith 4be4fc6b1f More 64-bit compilation/safety fixes. 2012-06-15 16:04:20 +01:00
Alex Smith 40e20c1076 Added gensyscalls headers for x86_64. 2012-06-14 14:18:50 +01:00
Alex Smith 11d3892d28 Changed ICI data argument types from uint32 to addr_t.
Since ICI arguments are used to send addresses in some places, uint32 is
not sufficient on x86_64. addr_t still refers to the same type as uint32
(unsigned long) on other platforms, so this change only really affects
x86_64.
2012-06-14 13:06:55 +01:00
Alex Smith ced5037133 Merge branch 'master' into x86_64 2012-06-13 17:47:34 +01:00
Alex Smith f76bc433e1 Added some x86_64 system/kernel headers and kernel Jamfiles.
* Not all of these headers are correct yet, just adding what's necessary
  to get things to compile for the time being.
2012-06-13 17:45:22 +01:00
Alex Smith 0e88a887b4 First round of 64-bit safety fixes in the kernel.
* Most of this is incorrect printf format strings. Changed all strings
  causing errors to use the B_PRI* format string definitions, which
  means the strings should be correct across all platforms.
* Some other fixes for errors, casts required, etc.
2012-06-13 17:42:46 +01:00
Alex Smith 23d878482e Made *_addr_t {,un}signed long rather than long long on x86_64.
* long is 64-bit on x86_64.
* Makes addr_t compatible with size_t.
2012-06-13 17:00:57 +01:00
Alex Smith 0d916c34c4 x86_64: added linker script for the kernel.
* Based on the x86 one, changes made to match the default GCC x86_64 linker
  script and correct kernel load address added.
* Not tested yet as the kernel doesn't fully compile.
2012-06-11 12:49:14 +01:00
Alex Smith 2f3e39bebf Fixed copyright date on arch_config.h. 2012-06-11 12:09:36 +01:00
Alex Smith 07b33113a3 Merge branch 'master' into x86_64 2012-06-11 12:01:35 +01:00
Alex Smith 65ad1ba320 Made it possible to build the bootloader when targetting x86_64.
* x86_64 is using the existing *_ia32 boot platforms.
* Special flags are required when compiling the loader to get GCC to compile
  32-bit code. This adds a new set of rules for compiling boot code rather
  than using the kernel rules, which compile using the necessary flags.
* Some x86_64 private headers have been stubbed by #include'ing the x86
  versions. These will be replaced later.
2012-05-26 21:47:27 +01:00
Alex Smith 81eb68f280 Fixed a compilation failure for the x86_64 toolchain.
This appears to be a problem with GCC's build system: it defaults to having
multilib enabled, but if it is explicitly enabled with --enable-multilib,
the build fails.

Signed-off-by: Ingo Weinhold <[email protected]>
2012-04-05 13:15:24 +02:00