diff options
author | Matt Caswell <matt@openssl.org> | 2015-02-17 14:30:22 +0100 |
---|---|---|
committer | Matt Caswell <matt@openssl.org> | 2015-11-21 00:32:18 +0100 |
commit | 501083049590455b1862edd7573fd51bb37bb037 (patch) | |
tree | 0ac76d39b5222fe01e80474bcdd17077796af3a8 /crypto/async/arch | |
parent | Various windows build fixes to prepare for windows port (diff) | |
download | openssl-501083049590455b1862edd7573fd51bb37bb037.tar.xz openssl-501083049590455b1862edd7573fd51bb37bb037.zip |
Async port to windows
Reviewed-by: Rich Salz <rsalz@openssl.org>
Diffstat (limited to 'crypto/async/arch')
-rw-r--r-- | crypto/async/arch/async_posix.c | 85 | ||||
-rw-r--r-- | crypto/async/arch/async_posix.h | 89 | ||||
-rw-r--r-- | crypto/async/arch/async_win.c | 84 | ||||
-rw-r--r-- | crypto/async/arch/async_win.h | 84 |
4 files changed, 342 insertions, 0 deletions
diff --git a/crypto/async/arch/async_posix.c b/crypto/async/arch/async_posix.c new file mode 100644 index 0000000000..281f25fdaf --- /dev/null +++ b/crypto/async/arch/async_posix.c @@ -0,0 +1,85 @@ +/* crypto/async/arch/async_posix.c */ +/* + * Written by Matt Caswell (matt@openssl.org) for the OpenSSL project. + */ +/* ==================================================================== + * Copyright (c) 2015 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + */ + +#include "../async_locl.h" +#include <openssl/async.h> + +#ifdef ASYNC_SYSV +# include <stddef.h> +# include <ucontext.h> +# include <openssl/crypto.h> +# include <openssl/async.h> + +__thread ASYNC_CTX *sysvctx; + +int ASYNC_FIBRE_init(ASYNC_FIBRE *fibre) +{ + void *stack = NULL; + + if (!(stack = OPENSSL_malloc(SIGSTKSZ))) { + return 0; + } + + fibre->fibre.uc_stack.ss_sp = stack; + fibre->fibre.uc_stack.ss_size = SIGSTKSZ; + fibre->fibre.uc_link = NULL; + + return 1; +} + +void ASYNC_FIBRE_free(ASYNC_FIBRE *fibre) +{ + if (fibre->fibre.uc_stack.ss_sp) + OPENSSL_free(fibre->fibre.uc_stack.ss_sp); +} +#endif diff --git a/crypto/async/arch/async_posix.h b/crypto/async/arch/async_posix.h new file mode 100644 index 0000000000..373ad1b934 --- /dev/null +++ b/crypto/async/arch/async_posix.h @@ -0,0 +1,89 @@ +/* crypto/async/arch/async_posix.h */ +/* + * Written by Matt Caswell (matt@openssl.org) for the OpenSSL project. + */ +/* ==================================================================== + * Copyright (c) 2015 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + */ +#include <openssl/e_os2.h> + +#ifdef OPENSSL_SYS_UNIX + +# include <unistd.h> + +# if _POSIX_VERSION >= 200112L + +# define ASYNC_SYSV +# define ASYNC_ARCH + +# include <ucontext.h> + +extern __thread ASYNC_CTX *sysvctx; + +typedef struct async_fibre_st { + ucontext_t fibre; +} ASYNC_FIBRE; + +# define ASYNC_set_ctx(nctx) (sysvctx = (nctx)) +# define ASYNC_get_ctx() (sysvctx) +# define ASYNC_FIBRE_swapcontext(o,n,r) \ + ((r)? \ + !swapcontext(&(o)->fibre, &(n)->fibre) \ + : \ + !setcontext(&(n)->fibre)) +# define ASYNC_FIBRE_makecontext(c) \ + (ASYNC_FIBRE_init(c) \ + && !getcontext(&(c)->fibre) \ + && (makecontext(&(c)->fibre, ASYNC_start_func, 0), 1)) +# define ASYNC_FIBRE_init_dispatcher(d) + +int ASYNC_FIBRE_init(ASYNC_FIBRE *fibre); +void ASYNC_FIBRE_free(ASYNC_FIBRE *fibre); + +# endif +#endif diff --git a/crypto/async/arch/async_win.c b/crypto/async/arch/async_win.c new file mode 100644 index 0000000000..23447b068d --- /dev/null +++ b/crypto/async/arch/async_win.c @@ -0,0 +1,84 @@ +/* crypto/async/arch/async_win.c */ +/* + * Written by Matt Caswell (matt@openssl.org) for the OpenSSL project. + */ +/* ==================================================================== + * Copyright (c) 2015 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + */ + +#include "async_win.h" + +#ifdef ASYNC_WIN + +# include <windows.h> +# include "cryptlib.h" + +void ASYNC_start_func(void); + +int ASYNC_FIBRE_init_dispatcher(ASYNC_FIBRE *fibre) +{ + LPVOID dispatcher; + + dispatcher = + (LPVOID) CRYPTO_get_thread_local(CRYPTO_THREAD_LOCAL_ASYNC_DISPATCH); + if (!dispatcher) { + fibre->fibre = ConvertThreadToFiber(NULL); + CRYPTO_set_thread_local(CRYPTO_THREAD_LOCAL_ASYNC_DISPATCH, + (void *)fibre->fibre); + } else { + fibre->fibre = dispatcher; + } + return 1; +} + +VOID CALLBACK ASYNC_start_func_win(PVOID unused) +{ + ASYNC_start_func(); +} + +#endif diff --git a/crypto/async/arch/async_win.h b/crypto/async/arch/async_win.h new file mode 100644 index 0000000000..6c2a31007d --- /dev/null +++ b/crypto/async/arch/async_win.h @@ -0,0 +1,84 @@ +/* crypto/async/arch/async_win.h */ +/* + * Written by Matt Caswell (matt@openssl.org) for the OpenSSL project. + */ +/* ==================================================================== + * Copyright (c) 2015 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * licensing@OpenSSL.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + */ + +#include <openssl/async.h> + +/* + * This is the same detection used in cryptlib to set up the thread local + * storage that we depend on, so just copy that + */ +#if defined(_WIN32) || defined(__CYGWIN__) +# define ASYNC_WIN +# define ASYNC_ARCH + +# include <windows.h> +# include "cryptlib.h" + +typedef struct async_fibre_st { + LPVOID fibre; +} ASYNC_FIBRE; + +# define ASYNC_set_ctx(nctx) \ + (CRYPTO_set_thread_local(CRYPTO_THREAD_LOCAL_ASYNC_CTX, (void *)(nctx))) +# define ASYNC_get_ctx() \ + ((ASYNC_CTX *)CRYPTO_get_thread_local(CRYPTO_THREAD_LOCAL_ASYNC_CTX)) +# define ASYNC_FIBRE_swapcontext(o,n,r) \ + (SwitchToFiber((n)->fibre), 1) +# define ASYNC_FIBRE_makecontext(c) \ + ((c)->fibre = CreateFiber(0, ASYNC_start_func_win, 0)) +# define ASYNC_FIBRE_free(f) (DeleteFiber((f)->fibre)) + +int ASYNC_FIBRE_init_dispatcher(ASYNC_FIBRE *fibre); +VOID CALLBACK ASYNC_start_func_win(PVOID unused); + +#endif |