Comments (2)
Quote from How to write assembler for x86 NaCl platform:
Why would you need a call without ret? How could you return from function? And can you ever call function indirecly? Contemporary technologies use function pointers (in different forms) quite extensively. The answer to this question brings us to a superinstruction notion.
In 32 bit case there are exactly two superinstructions:
naclcall
andnacljmp
. They can be used with any 32 bit general purpose register (and only register, never memory!) to do an indirect jump. And i686-nacl-as also gives you thenaclret
macro which simply callspop %ecx
and thennacljmp %ecx
(%ecx
is picked because it's neither caller-saved register not callee-saved register in x86 ELF ABI).There are nothing magical in
naclret
, butnaclcall
andnacljmp
are magical. How come? Let's see:
$ cat nacljmp.s
nacljmp %eax
$ pepper_33/toolchain/linux_x86_newlib/bin/i686-nacl-as nacljmp.s -o nacljmp.o
$ pepper_33/toolchain/linux_x86_newlib/bin/i686-nacl-objdump -d nacljmp.o
nacljmp.o: file format elf32-i386-nacl
Disassembly of section .text:
00000000 <.text>:
0: 83 e0 e0 and $0xffffffe0,%eax
3: ff e0 jmp *%eax
As you can see this superinstruction actually combines two different instructions: and and jmp. This combination guarantees that target address for
nacljmp
is always aligned: you can not usenacljmp
(ornaclcall
) to jump in the middle of 32-byte bundle. And i686-nacl-as guarantees that instructions in your code will never straggle boundary of such bundle. These two facts combined mean that code can be statically disassembled and verified. Which in turn means that NaCl validator does not effect performance of your code at all: it does it's work once, and then your code is executed by CPU directly without additional overhead (bundles and lack of ret will create some small overhead, of course, but it's very small). That's really, really cool. There is one tiny problem though: what happens if address which you are using as a target is not actually aligned? IOW: how can call work in this scheme. The answer is simple: call is magical in i686-nacl-as, too (and naclcall is doubly magical): i686-nacl-as always moves it to the end of bundle which means that address in stack is properly aligned.
from rv32emu.
Unable to find the evident use case.
from rv32emu.
Related Issues (20)
- CI: Generate Docker image with commit SHA1 HOT 2
- Compare with libriscv HOT 1
- Fix potential security issue in benchmark script
- jit: code generation tool should be aware of comments
- jit: Incomplete `muldivmod`
- Evaluate a hybrid approach for macro-operation fusion in both the decoding and execution stages
- Consolidate public header by integrating src/state.h HOT 1
- jit: Several errors are detected when running CoreMark
- Refactoring RISC-V emulation APIs for easier adoption and porting HOT 30
- jit: Enhance security by Control-Flow Integrity
- Comparing Interpreter performance with Wasm3
- Incorrect global/static float array initialization HOT 2
- Fail to build when ENABLE_EXT_C=0 ENABLE_JIT=1 HOT 1
- Accelerate ISA simulation by tiered JIT compilation HOT 13
- Assertion fail when running jit-bf with ENABLE_JIT=1
- jit: Implement register allocation for T1C HOT 2
- Provide minimal cross-platform GUI library HOT 2
- Incorrect basename generated by dynamic profiler
- jit: Assertion while running aes.elf HOT 2
- Potential uninitialized value read without initialization HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from rv32emu.